繁体   English   中英

钳位幅度不适用于 RigidBody.Velocity

[英]Clamp magnitude not working on RigidBody.Velocity

我正在使用 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 控制,希望你们觉得这篇文章有用! 自我注意=刚体=头痛!

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

为了防止将来发生这种情况,我个人的偏好是在您的脚本中将其设为private ,直到您准备好仅在 Inspector 中开始设置选项。 这可确保您在 MonoDevelop 中创建的更改是您期望生效的更改,直到您准备好将该组件完善为完整且可在 Inspector 中进行自定义。

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM