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

Unity3d 如何在Unity 3D中锁定物理体在z轴上的位置,unity3d,Unity3d,我正在开发一款2.5D游戏。在那个游戏中,我希望我的角色(有刚体组件连接)在x轴和y轴上移动。因此,我使用以下代码片段: private void LockZAxis () { Vector3 currentPosition = _rigidbody.position; currentPosition.z = 0; _rigidbody.position = currentPosition; } 我在Update、FixedUpdate和LateUpdate的末尾都调用

我正在开发一款2.5D游戏。在那个游戏中,我希望我的角色(有刚体组件连接)在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 ();
}

刚体用于模拟物理,通过在每帧设置刚体的位置,你基本上在每帧传送角色。你可以限制z轴的移动,这将阻止它在应用物理时在z轴上移动,这就是刚体通常的用途

以下是如何限制刚体位置更改:


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

物理重力是否设置为仅影响Y位置?
Physics.gravity=新矢量3(0,-1.0F,0)

并设置这些
rigidbody.angularVelocity=Vector3.0
刚体.velocity.z=0

确保您的刚体设置为运动学,因为您使用的是刚体。moveposition()和moveposition()将直接影响运动学刚体的内部速度


尝试使用moveposition()代替velocity进行跳跃

我很想扩展我的答案,但为此我需要更多的代码。请将代码添加到操作对象位置的位置,以及在设置每帧位置时为什么需要刚体。对于我的代码。我有两次操纵RegidBody的位置。那就是当我的角色跳跃的时候,我使用这个:_rigidbody.velocity=Vector3.up*jumpForceUp+transform.forward*jumpForceForward;当我想让我的角色移动快一点的时候,每一帧都有:Vector3 newPosition=transform.position+transform.forward*speed*Time.deltaTime;newPosition.z=0_刚体。移动位置(新位置);LockZAxis();你有没有检查你的动画是否有一些根运动?如果是这样,这可能是你的y位置超时改变的原因。@Kardux是的,我实际上是在应用根动画。并且根动画不具备与x位置独立锁定z位置的能力。我仍然想应用根动画,让动画在x轴和y轴上移动我的对象。我也设置了冻结位置Z,但它仍然不起作用。运行一段时间后,其z位置远离0,因此无法与z=0的碰撞器碰撞。如前所述,当您“传送”对象时,它将不起作用。刚体用于物理,限制用于物理。另外,请看我对你的问题的评论。是的,我也回复了你的评论。请看。我该怎么办doe MovePosition能帮上忙吗?嗨。更改Regidbody.position是官方统一文件推荐的执行跳跃的方法。您可以在这里查看()。是的,我已经确定重力只影响Y的位置。我不认为我需要将Rigibody设置为运动学来使用MovePosition,您有任何参考链接吗?。“如果刚体的IsKinetic设置为false,则其工作方式不同。它的工作方式类似于transform.position=newPosition并传送对象(而不是平滑过渡)。”传送对象可能会导致一些物理问题