2017-04-11 326 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