如何防止向上的刚体速度?
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;
}
}
我有一组物体,我允许我的玩家在零重力的情况下在场景中抛来抛去。但是我想在一定高度后创建不可见边界类型。到目前为止,当对象达到某个向上界限时,我一直在我的 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;
}
}