Clamp Magnitude无法正常使用RigidBody.Velocity

时间:2013-11-01 10:01:31

标签: c# mono unity3d game-physics

使用,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);

在D = 12.1911之前重新创建快照                       之后= 12.1911                       之后= 12.38866                       之后= 12.50772

希望这些信息有所帮助。

更新:(回答)

感谢Blue先生的一些帮助,似乎问题是变量maxVel,因为它是公开的,它似乎在我的检查器中被更改,设置为私有并且检查输入固定更新已经完成了诀窍。所以这个脚本现在可以工作,让用户在刚体的X轴上进行2d控制,希望你们发现这个帖子很有用! 注意Self = Rigid-Bodys =头痛!

2 个答案:

答案 0 :(得分:3)

我认为问题如下:在物理引擎更新之前调用FixedUpdate方法。

因此,试图钳制速度无效,因为施加到RigidBody的力将在钳位后施加。你将通过这种方式获得的唯一效果是在施加新力之前降低实际速度。这是一个猜测,因为我对Unity3D中的物理不太熟悉,但我认为如果你使用WaitForFixedUpdate,你可以在物理引擎更新之后将其钳制。

您的代码的另一个可能无关的问题是,您正在FixedUpdate内获取输入。你不应该这样做:在Update内保持输入处理并在FixedUpdate内部施加力。

答案 1 :(得分:2)

您的maxVel上的默认值可能在Unity检查器中为该对象设置为不同的值。您可以重置组件,它将返回到您在脚本中设置的默认值。

为了防止将来出现这种情况,我个人的偏好是在您的脚本中设置private,直到您准备好开始仅在Inspector中设置选项。这可确保您在MonoDevelop中创建的更改是您希望在检查器中完成并可自定义该组件的整理后生效的更改。

我通过使用TODO的简单注释来跟踪这些变量:并注意如何使它们可调节

private float MoveSpeed = 10.0f;     //TODO: Make MoveSpeed inspector adjustable (possibly slider control)
private float maxVel = 0.000000001f; //TODO: Make maxVel inspector adjustable