【发布时间】:2013-11-12 12:29:54
【问题描述】:
我正在使用 c# mono 和 unity3d 4.1.2。
我有以下脚本:
using UnityEngine;
using System.Collections;
public class PlayerMove : MonoBehaviour
{
public float MoveSpeed = 10.0f;
public float maxVel = 0.000000001f;
// Use this for initialization
void Start ()
{
}
void FixedUpdate()
{
if(Input.GetKey(KeyCode.D))
{
Debug.Log("D got called");
rigidbody.AddForce(Vector3.right * MoveSpeed);
}
if(Input.GetKey(KeyCode.A))
{
Debug.Log("A got called");
rigidbody.AddForce(Vector3.left * MoveSpeed);
}
rigidbody.velocity = Vector3.ClampMagnitude(rigidbody.velocity, maxVel);
Debug.Log (rigidbody.velocity.x);
}
// Update is called once per frame
void Update ()
{
}
}
您可能会说,这是一个简单的玩家移动脚本。我有一个刚体连接到一个球体,我希望通过“AddForce”沿 x 轴左右移动它。
除了一个问题外,一切都很好,我尝试使用“clampMagnitude”在刚体上实现最大速度,但它似乎什么也没做。我什至将“maxVel”值设置为 0.000000001!看看会不会有什么事发生。
显然我在这里遗漏了一些东西,谁能指出问题所在?
其他信息:
刚体不是运动学的,但确实使用了重力(这是我计划在未来更改的功能,但无关紧要)。
调试信息
if(Input.GetKey(KeyCode.D))
{
rigidbody.AddForce(Vector3.right * MoveSpeed);
Debug.Log("BEFORE = " + rigidbody.velocity.magnitude);
}
if(Input.GetKey(KeyCode.A))
{
rigidbody.AddForce(Vector3.left * MoveSpeed);
}
rigidbody.velocity = Vector3.ClampMagnitude(rigidbody.velocity, maxVel);
Debug.Log("AFTER = " + rigidbody.velocity.magnitude);
Reuslt D 上的快照,之前 = 12.1911 之后 = 12.1911 之后 = 12.38866 之后 = 12.50772
更新:(答案)
感谢 Blue 先生的帮助,问题似乎出在变量 maxVel 上,因为它是公开的,它似乎在我的检查器中发生了变化,设置为私有并检查了固定更新的输入就可以了。所以这个脚本现在可以工作了,让用户在刚体的 X 轴上进行二维控制,希望你们觉得这篇文章有用! 自我注意 = 刚体 = 头痛!
【问题讨论】:
-
角色移动是必须的,还是可以直接影响它的速度/位置?
-
以及它的刚体我听说最好的做法是施加力而不是强制更新位置,虽然我将来会使用我自己的物理可能会改变,但现在假设它需要加力。至于速度,加力应用“加速度”,因为速度是一个设定值,看起来不太好呵呵
-
可能值得
Debug.Logging 设置前后的幅度,你得到什么值? -
好主意,现在测试一下
-
好的,试试刚体.velocity.magnitude
标签: c# mono unity3d game-physics