2017-04-11 2109 views
0

我正在开发一个2.5D的游戏。在那场比赛中,我希望我的角色(有Rigidbody组件连接到)在x和y轴上移动。所以我用这个代码片段:如何锁定在Z轴物理体的位置在Unity 3D

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

我呼吁在这两个更新,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(); 
} 
+0

我很想扩展我的答案,但为此我需要更多的代码。请将代码添加到操纵对象位置的位置,以及为什么在每帧设置位置时需要刚体。 – Maakep

+0

对于我的代码。有两次我操纵RegidBody的位置。这时候,我的性格跳,那个时候我用这个: _rigidbody.velocity = Vector3.up * jumpForceUp + transform.forward * jumpForceForward; 当我想我的性格移动更快一点,所以在更新的方法,我有这样的每一帧: 的Vector3在newPosition = transform.position + transform.forward *速度* Time.deltaTime; newPosition.z = 0; _rigidbody.MovePosition(newPosition); LockZAxis(); – congtrungvnit

+0

请用代码更新答案,在评论部分阅读代码非常困难。 :) – Maakep

回答

1

一个刚体用于模拟物理,通过设置刚体的位置每帧你基本上瞬移每帧的字符。您可以限制z轴上的运动,这将防止物理应用时它在z轴上移动,这是通常使用的刚体。 Please see how to restrict rigidbody positional change here

如果您运行LockZAxis()后,你已经改变了它应该瞬移对象为0每一帧的Z位置的位置。请确保z轴是正确的轴。您可以通过暂停正在运行的游戏并操作Transform值来查看每个轴如何移动Object。

+0

我也设置了冻结位置Z,但它仍然不起作用。运行一段时间后,它的z位置远离0,然后它不会与z = 0的碰撞体碰撞。 – congtrungvnit

+0

如上所述,当你“传送”物体时,它不会工作。刚体与物理学一起使用,而物理学则受到限制。另外,请参阅我对你的问题的评论。 – Maakep

+0

是的,我也回复了你的评论。请参见。那么我该怎么做,MovePosition在这种情况下可以提供帮助吗? – congtrungvnit

0

是物理学的重力设置为只影响Y位置? Physics.gravity = new Vector3(0, -1.0F, 0);

而且这些设置也 rigidbody.angularVelocity = Vector3.zero; rigidbody.velocity.z=0;

确保您的刚体设置为运动,因为你正在使用Rigidbody.moveposition(),并使用moveposition()将直接影响内部对运动刚体

速度

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

+0

嗨。更改Regidbody.position是官方Unity文档推荐的用于实现跳转的方式。你可以在这里查看(https://docs.unity3d.com/ScriptReference/Rigidbody-position.html)。是的,我已经将重力设置为只影响Y位置。我认为我不需要将Rigibody设置为运动式来使用MovePosition,您是否有任何参考链接? – congtrungvnit

+0

https://docs.unity3d.com/ScriptReference/Rigidbody.MovePosition.html。 “如果刚体的运动集设置为false,则它的工作方式不同,它的工作方式与transform.position = newPosition类似,并传送对象(而不是平滑过渡)。”传送物体可能会导致物理问题 – Jasonbryant28

+0

好的,谢谢您的参考。我会查一下。 – congtrungvnit