钳位幅度不适用于 RigidBody.Velocity

Posted

技术标签:

【中文标题】钳位幅度不适用于 RigidBody.Velocity【英文标题】:Clamp magnitude not working on RigidBody.Velocity 【发布时间】: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 【参考方案1】:

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

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

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

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

【讨论】:

经过一些测试,确实是问题所在,谢谢blue先生,很高兴看到这是一个简单的范围问题【参考方案2】:

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

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

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

【讨论】:

感谢您提供的信息,当我回到家时,我也会测试该理论并发布结果

以上是关于钳位幅度不适用于 RigidBody.Velocity的主要内容,如果未能解决你的问题,请参考以下文章

在 OpenCv Mat 中钳位值的最有效方法

最大钳位电压和额定钳位电压

C++ 库中有任何内置的钳位方法吗?

这个函数有啥作用?与钳位值有关吗?

python 钳位价值

glTexImage2D 何时发生钳位