如何在Unity 3D中锁定物理体在z轴上的位置

时间:2017-04-11 14:09:44

标签: unity3d

我正在开发一款2.5D游戏。在那个游戏中,我希望我的角色(附有Rigidbody组件)只能在x和y轴上移动。所以我使用这段代码:

private void LockZAxis () {
    Vector3 currentPosition = _rigidbody.position;
    currentPosition.z = 0;
    _rigidbody.position = currentPosition;
}

我在Update,FixedUpdate和LateUpdate的末尾都调用了这个LockZAxis方法。但它不起作用。当我的角色向前跑一段时间时,它的z位置仍然会改变。

有关其他信息,在我的代码中,我有两次操纵RegidBody的位置。第一个是我的角色跳跃,那个时候我用它:

jumpVelocityVector = Vector3.up * jumpForceUp + transform.forward * jumpForceForward;
_rigidbody.velocity = jumpVelocityVector;

每一帧我想让我的角色移动得更快一点,所以在更新方法中,我有这个:

void Update () {
    Vector3 newPosition = transform.position + transform.forward * speed * Time.deltaTime;
    newPosition.z = 0;
    _rigidbody.MovePosition (newPosition);

    LockZAxis ();
}

2 个答案:

答案 0 :(得分:1)

刚体用于模拟物理,通过设置刚体的位置每帧你实际上是每帧传送角色。您可以限制z轴的移动,这将阻止它在应用物理时在z轴上移动,这通常是刚体的用途。 Please see how to restrict rigidbody positional change here

如果你在之后运行LockZAxis() ,你已经改变了位置,它应该将对象传送到每帧的z位置0。请确保z轴是正确的轴。您可以通过暂停正在运行的游戏并操纵变换值来查看每个轴如何移动对象来调试此操作。

答案 1 :(得分:0)

物理引力是否仅设定为影响Y位置?  Physics.gravity = new Vector3(0, -1.0F, 0);

并设置这些 rigidbody.angularVelocity = Vector3.zero;  rigidbody.velocity.z=0;

确保你的刚体被设置为运动学,因为你正在使用Rigidbody.moveposition()并且使用moveposition()将直接在运动学刚体上实现速度

尝试使用moveposition()跳跃而不是速度