如何防止向上的刚体速度?

How to prevent upward rigidbody velocity?

我有一组物体,我允许我的玩家在零重力的情况下在场景中抛来抛去。但是我想在一定高度后创建不可见边界类型。到目前为止,当对象达到某个向上界限时,我一直在我的 FixedUpdate 中这样做...

GetComponent<Rigidbody>().velocity = GetComponent<Rigidbody>().velocity - Vector3.Project(GetComponent<Rigidbody>().velocity, transform.up);

...这在某种意义上是有效的,但因为它使用的是 transform.up,它正在消除向上和向下运动的速度,我需要将其限制为仅向上运动。这可能吗?

也许您可以检查速度的 y 分量,如果它是正数(向上),则将其设置为 0?如果它是负数(向下)就保持它。

PS。我认为您应该获得一个引用刚体组件的变量,以尽量减少 GetComponent 调用。

Vector3 v = rb.velocity; //get the velocity
v.y = v.y > 0 ? 0 : v.y; //set to 0 if positive
rb.velocity = v; //apply the velocity

您可以只检查位置是否达到阈值以及物体当前是否正在向上移动

[SerializeField] private Rigidbody rb;
[SerializeField] private float maxY;

private void Awake()
{
    if(!rb) rb = GetComponent<Rigidbody>();
}

private void FixedUpdate()
{
    var velocity = rb.velocity; 
    if(rb.position.y >= maxY && velocity.y > 0) 
    { 
        velocity.y = 0; 
        rb.velocity = velocity; 
    }
}