2017-06-13 91 views
1

私はすでに前方移動と左側移動を定義しています。どのように私はそれを斜めに(左と上に)移動させるのですか?ありがとうございます。Unity - 斜めに移動する方法

if (Input.GetKey(KeyCode.W)) 
    { 
     player.MovePosition(transform.position + transform.forward * speed * Time.deltaTime); 
    } 

    if(Input.GetKey(KeyCode.W) && Input.GetKey(KeyCode.A)) 
    { 
     ??? 
    } 

    if (Input.GetKey(KeyCode.A)) 
    { 
     player.MovePosition(transform.position - transform.right * speed * Time.deltaTime); 
    } 
+1

これを定義する必要はありません.WとAを押すと 'if'が適用され、オブジェクトは斜​​めに移動します。 – Gusman

+0

それはしません。 –

+0

コードをデバッグし、両方のIFに入力するかどうかを確認します。十分なはずです。 – Gusman

答えて

6

それはあなたの現在のコードが原因Rigidbody.MovePosition()の癖に動作しないことは注目に値します - そのドキュメントはそれを言及しませんが、the 2D variant of the methodのために、それはその

実際の位置変更言及しています次回の物理更新時にのみ発生し、次の物理更新を待たずにこのメソッドを繰り返し呼び出すと、最後の呼び出しが使用されます。

両方のキーが押されたときに文が入力されます両方の場合がそう、最後の1で唯一MovePosition()が有効になります。

この問題を解決するには、すぐにMovePosition()を呼び出す代わりに、組み合わせた動きベクトルを計算することをお勧めします。続いて、最後に動きベクトルを適用するので、あなたは今まで一度MovePosition()を呼び出す必要があります:

Vector3 totalMovement = Vector3.zero; 

if (Input.GetKey(KeyCode.W)) 
{ 
    totalMovement += transform.forward; 
} 
if (Input.GetKey(KeyCode.A)) 
{ 
    totalMovement -= transform.right; 
} 

// To ensure same speed on the diagonal, we ensure its magnitude here instead of earlier 
player.MovePosition(transform.position + totalMovement.normalized * speed * Time.deltaTime); 

ホープ、このことができます!ご質問がある場合はお知らせください。

+0

ありがとうございました!それが私の問題を解決しました。私はまた、左と右の動きのために回転の動きを追加したので、プレーヤーは回ることができます。 –

+0

素晴らしい!私は助けてくれてうれしいです。 – Serlite

1

あなたが本当にあなたの現在の構造上に保持したい場合は、これは何が必要です:

if(Input.GetKey(KeyCode.W) && Input.GetKey(KeyCode.A)) 
{ 
    player.MovePosition(transform.position + (transform.forward - transform.right).normalized * speed * Time.deltaTime); 
} 

ベクトル加算はユニティでサポートされていますので、あなたは、単にそれらを一緒に合計することができます。このif文が呼び出されると、他の誰もチェックする機会がないことを確認する必要があります。

しかし、私はクリーナーソリューションのためにhttp://answers.unity3d.com/questions/566046/diagonal-movement.htmlを見ることをお勧めします。 Gusmanはそうです。それぞれのケースを明示的に定義することなくこれを行う方法があります。

関連する問題