2017-04-11 8 views
0

私は2.5Dゲームを開発しています。そのゲームでは、私のキャラクター(リジッドボディーコンポーネントが付属しています)がx軸とy軸に移動するだけです。だから私は、このコードスニペットを使用します。ユニティ3Dでz軸の体の位置を固定する方法

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

私は更新、FixedUpdateとLateUpdate両方の最後に、このLockZAxisメソッドを呼び出します。しかし、それは動作しません。私のキャラクターがしばらく先に進むと、そのzポジションは変更されます。

私のコードでは、RegidBodyの位置を操作する方法が2回あります。私は私のキャラクターが少し速く移動したいとき更新方法では、私がこれ持っているので、

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の位置を2回操作します。それは私のキャラクターがジャンプするとき、私はこれを使用します: _rigidbody.velocity = Vector3.up * jumpForceUp + transform.forward * jumpForceForward; 私のキャラクターが少し速く動くようにしたいときは、更新メソッドで、私はこれを持っています: Vector3 newPosition = transform.position + transform.forward * speed * Time.deltaTime; newPosition.z = 0; _rigidbody.MovePosition(newPosition); LockZAxis(); – congtrungvnit

+0

答えをコードで更新してください。コメントセクションでコードを読むのは難しいです。 :) – Maakep

答えて

1

リジッドボディーは、フレームごとにリジッドボディの位置を設定することで、フレームごとに文字を本質的にテレポートして、物理学をシミュレートするために使用されます。 z軸での移動を制限することができます。これは、剛体が一般的に使用されているように、物理が適用されたときにz軸で移動するのを防ぎます。 Please see how to restrict rigidbody positional change here

あなたが実行している場合は、あなたのあなたはそれが0すべてのフレームのz位置にオブジェクトをテレポートべき位置を変更した後LockZAxis()。 z軸が正しい軸であることを確認してください。これをデバッグするには、実行中のゲームを一時停止し、Transformの値を操作して、各軸がオブジェクトをどのように動かすかを確認します。

+0

フリーズポジションZも設定しましたが、それでも動作しません。しばらくの間実行すると、そのz位置は0から遠くなり、z = 0のコライダーと衝突することはありません。 – congtrungvnit

+0

前述のように、オブジェクトを「テレポート」しているときは機能しません。剛体は物理学で使用され、制限は物理学のためのものです。また、あなたの質問に私のコメントを参照してください。 – Maakep

+0

ええ、あなたのコメントにも返信しました。参照してください。だから私は何をしなければならない、doe MovePositionはこのケースで助けることができる? – congtrungvnit

0

物理学重力はY位置にのみ影響を与えるように設定されていますか? Physics.gravity = new Vector3(0, -1.0F, 0);

そして、設定これらも rigidbody.angularVelocity = Vector3.zero; rigidbody.velocity.z=0;

あなたの剛体はあなたがRigidbody.moveposition()を使用してmovepositionを(使用しているため、動するように設定されていることを確認してください)直接内部動剛体

上の速度に影響します

あなたのために速度の代わりにジャンプを使用してみてください

+0

こんにちは。 Regidbody.positionを変更することは、公式のUnity文書によって実装のジャンプについて推奨される方法です。ここで確認できます(https://docs.unity3d.com/ScriptReference/Rigidbody-position.html)。そして、はい、私は確かにYの位置に影響を与えるように重力を設定しました。私はMovePositionを使用するためにRigibodyをキネマティックに設定する必要はないと思いますが、これに関連する参照リンクはありますか? – congtrungvnit

+0

https://docs.unity3d.com/ScriptReference/Rigidbody.MovePosition.html。 "剛体にキネマティックが設定されていれば、それは違った働きをします。それはtransform.position = newPositionのように機能し、オブジェクトをテレポートします(滑らかな遷移ではありません)。オブジェクトをテレポートして物理的に問題を起こす可能性があります。 – Jasonbryant28

+0

よろしくお願いします。私はそれをチェックします。 – congtrungvnit

関連する問題