2016-11-04 5 views
0

私はユニティで3Dゲームを作成しています。マウスを使って見ることができるスクリプトがあります。見ている方向にプレーヤーを移動するために、私はtransform.forwardを使用しています。私の問題は、天井を見て「W」(前進)を押すと、彼らは空気の中に浮上し始めるということです。基本的には、x軸とz軸だけを動かすことができるtransform.forwardのメソッドまたはサブメソッドがあるかどうかを知る必要があります。ユニティでのY軸の動きを防ぐ `transform.forward`

if (transform.rotation.x < -10) 
     { 
      //do no forward or backward movement 
      Debug.Log("Rotation too great to forward move..."); 
      tooGoodForMovement = true; 

     } 
     else 
     { 
      tooGoodForMovement = false; 
      if (Input.GetKey(KeyCode.W)) 
      { 
       //Forward 
       player.velocity = (transform.FindChild("Main Camera").transform.forward * moveSpeed); 
      } 
      if (Input.GetKey(KeyCode.S)) 
      { 
       //Back 
       player.velocity = (-transform.FindChild("Main Camera").transform.forward * moveSpeed); 
      } 
     } 
     if (Input.GetKey(KeyCode.A)) 
     { 
      //Left 
      player.velocity = -transform.FindChild("Main Camera").transform.right * moveSpeed; 
     } 

     if (Input.GetKey(KeyCode.D)) 
     { 
      //Right 
      player.velocity = transform.FindChild("Main Camera").transform.right * moveSpeed; 
     } 

答えて

2

が一時変数にあなたの速度ベクトルを設定し、ゼロにYをリセットしてください:

は、ここに私の動きスクリプト(C#の)です。

Transform camera; 

void Start() 
{ 
    //Cache transform.FindChild so that we don't have to do it every time 
    camera = transform.FindChild("Main Camera"); 
} 

は、その後、あなたの他の機能に:

Vector3 velocity = Vector3.zero; 

if (transform.rotation.x < -10) 
{ 
    //do no forward or backward movement 
    Debug.Log("Rotation too great to forward move..."); 
    tooGoodForMovement = true; 
} 
else 
{ 
    tooGoodForMovement = false; 
    if (Input.GetKey(KeyCode.W)) 
    { 
     //Forward 
     velocity = camera.forward * moveSpeed; 
    } 
    if (Input.GetKey(KeyCode.S)) 
    { 
     //Back 
     velocity = -camera.forward * moveSpeed; 
    } 
} 
if (Input.GetKey(KeyCode.A)) 
{ 
    //Left 
    velocity = -camera.right * moveSpeed; 
} 

if (Input.GetKey(KeyCode.D)) 
{ 
    //Right 
    velocity = camera.right * moveSpeed; 
} 

velocity.Y = 0; 
player.velocity = velocity; 
+1

これはokです。毎回行われた 'FindChild(" Main Camera ")'の修正を加えてください。それをキャッチすると良いでしょう。 – Programmer

+0

これは機能しました。ありがとうございました!私はそれを早期に考えていたはずです。また@Programmer、 'FindChild(" Main Camera ")'を修正するとどういう意味ですか? –

+0

@ Sub6Resources更新された回答を確認してください。 'FindChild'を使うのはずっとコストがかかります。トランスフォームをキャッシュします。 – Programmer