2016-08-28 3 views
0

私のプレーヤーがオブジェクトの前でジャンプするとき、それはちょうどそれを通して突き進んで、私はそれを修正する方法を知らない。私はそれが私のプレーヤーを移動するためにトランスフォームを使用しているためですが、これはジャンプするための最も簡単な方法でしたので、私はそれを変更したくないです。 - あなたが本当に変換によって暗示現在位置から目的地までのルートを計算する必要がある、とプレイヤーがオブジェクトを飛び越さないようにするにはどうすればよいですか?

using UnityEngine; 
using System.Collections; 

public class MovePlayer : MonoBehaviour 
{ 
    private Vector3 newPos; 
    private Vector3 up = new Vector3 (0, .3f, 0); 
    private bool jumping = false; 
    public Rigidbody rigidbody; 

    void Start(){ 
     rigidbody = GetComponent<Rigidbody>(); 
    } 

    void Update(){ 
     rigidbody.freezeRotation = true; 

     if (!jumping) { 
      if (Input.GetKeyDown (KeyCode.UpArrow)) { 
       newPos = Vector3.forward + transform.position; 
       transform.rotation = Quaternion.Euler (0, 0, 0); 
       transform.position = (newPos); 
       transform.position = newPos + up;    
      } 
      if (Input.GetKeyDown (KeyCode.DownArrow)) { 
       newPos = Vector3.back + transform.position; 
       transform.rotation = Quaternion.Euler (0, 180, 0); 
       transform.position = (newPos); 
       transform.position = newPos + up; 
      } 

      if (Input.GetKeyDown (KeyCode.RightArrow)) { 
       newPos = Vector3.right + transform.position; 
       transform.rotation = Quaternion.Euler (0, 90, 0); 
       transform.position = (newPos); 
       transform.position = newPos + up; 
      } 
      if (Input.GetKeyDown (KeyCode.LeftArrow)) { 
       newPos = Vector3.left + transform.position; 
       transform.rotation = Quaternion.Euler (0, -90, 0); 
       transform.position = (newPos); 
       transform.position = newPos + up; 
      }    
     } 
    } 

    void OnCollisionEnter(Collision other) 
    { 
     if (other.gameObject.CompareTag ("Ground")) 
      jumping = false; 
    } 

    void OnCollisionExit(Collision other) 
    { 
     if (other.gameObject.CompareTag("Ground")) 
      jumping = true; 
    } 
} 
+0

あなたは私はあなたのような何かを行うことができると思い衝突検出 – Stefan

+0

のいくつかの並べ替えをする必要があります...ちょうどtransform.positionRigidbodyを動かすような役に立たないだろうMovePositionMoveRotationを使用して、他の真/有効にするかである必要がありますあなたはジャンプのために行い、0にそれぞれの方向に "スピード"を設定しました。これは、衝突検出モードを連続に設定する必要があるかもしれません。またはプレーヤーのコライダーを(側面の可能性がある場合は上に)またはオブジェクトを少し増やします。 –

答えて

0

あなたの問題は、あなたがプレーヤーの位置に変換を適用していることである。ここに私のプレーヤーを移動するための私のコードですすべての中間点で衝突検出を行います。

これはWeb上の多くの例の問題ですが、Unity Collision Detectionを検索すると多くの例が示唆されます。

0

これは、それに接続されているRigidbodyとゲームオブジェクトである、とあなたがそれを移動させながら、衝突を検出したいので、あなたの代わりに、直接そのtransformコンポーネントを移動するのでMovePositionMoveRotation機能を使用する必要があります。

したがって、transform.position = newPos + up;となどのコードは、rigidbody.MovePosition(newPos + up);rigidbody.MoveRotation(Quaternion.Euler(0, 180, 0));に変更する必要があります。

有効Rigidbodyゲームオブジェクトをスムーズに動かすための補間。また、isKinematic

public class MovePlayer : MonoBehaviour 
{ 
    private Vector3 newPos; 
    private Vector3 up = new Vector3(0, .3f, 0); 
    private bool jumping = false; 
    public Rigidbody rigidbody; 

    void Start() 
    { 
     rigidbody = GetComponent<Rigidbody>(); 
    } 

    void Update() 
    { 
     rigidbody.freezeRotation = true; 

     if (!jumping) 
     { 
      if (Input.GetKeyDown(KeyCode.UpArrow)) 
      { 
       newPos = Vector3.forward + transform.position; 
       rigidbody.MoveRotation(Quaternion.Euler(0, 0, 0)); 
       rigidbody.MovePosition(newPos); 
       rigidbody.MovePosition(newPos + up); 
      } 
      if (Input.GetKeyDown(KeyCode.DownArrow)) 
      { 
       newPos = Vector3.back + transform.position; 
       rigidbody.MoveRotation(Quaternion.Euler(0, 180, 0)); 
       rigidbody.MovePosition(newPos); 
       rigidbody.MovePosition(newPos + up); 
      } 

      if (Input.GetKeyDown(KeyCode.RightArrow)) 
      { 
       newPos = Vector3.right + transform.position; 
       rigidbody.MoveRotation(Quaternion.Euler(0, 90, 0)); 
       rigidbody.MovePosition(newPos); 
       rigidbody.MovePosition(newPos + up); 
      } 
      if (Input.GetKeyDown(KeyCode.LeftArrow)) 
      { 
       newPos = Vector3.left + transform.position; 
       rigidbody.MoveRotation(Quaternion.Euler(0, -90, 0)); 
       rigidbody.MovePosition(newPos); 
       rigidbody.MovePosition(newPos + up); 
      } 
     } 
    } 

    void OnCollisionEnter(Collision other) 
    { 
     if (other.gameObject.CompareTag("Ground")) 
      jumping = false; 
    } 

    void OnCollisionExit(Collision other) 
    { 
     if (other.gameObject.CompareTag("Ground")) 
      jumping = true; 
    } 
} 
関連する問題