2016-04-23 16 views
0

私はゲームをプログラミングしているうちにC#を学んでいます。私は「D」または「A」を一度押すことによって、キャラクターが連続的に動くようにしたい。次に、右に行く間に目に見えない壁に衝突した後、目に見えない別の壁に当たって止まるまで後退します。 私は自分のGameObjectを動かすことができましたが、壁に衝突すると何も起こりません。両方のオブジェクトにはrigidbody2D、同じZ座標、正しいタグがあります。私は目に見えない壁を使用してい私の衝突2dはUnity上でC#で動作しません

public class SquadMovement : MonoBehaviour { 

    float speed; 
    bool collisionRightWall = false; 

    // Update is called once per frame 
    void Update() { 

     if (Input.GetKeyDown (KeyCode.D)) { 

      CancelInvoke(); 
      InvokeRepeating ("RightMovement", Time.deltaTime, Time.deltaTime); 

     } 

     if (Input.GetKeyDown (KeyCode.A)) { 

      CancelInvoke(); 
      InvokeRepeating ("LeftMovement", Time.deltaTime, Time.deltaTime); 

     } 
    } 

    void RightMovement() { 

     speed = 10f; 
     transform.Translate (speed * Time.deltaTime, 0, 0); 

    } 

    void LeftMovement() { 

     speed = -7f; 
     transform.Translate (speed * Time.deltaTime, 0, 0); 

    } 

    void OnCollisionWallR (Collider2D colR) { 

     if (colR.gameObject.tag == "invisibleWallRight") { 

      collisionRightWall = true; 
      Debug.Log (collisionRightWall); 

     } 
    } 
} 

私はx座標を使用する方法がわからないので、そこより効率的な方法である必要がありますが、私はこれが動作しない理由を最初に知ってほしいです。誰かが私にそれを教えることができたら嬉しいです。

+0

コライダートリガーの後に戻ってプレーヤーを送信ロジックがありますか? – gabriel

+0

CancelInvoke()とは何ですか? InvokeRepeating( "LeftMovement"、Time.deltaTime、Time.deltaTime); ? Updateメソッドはすべてのフレームで自動的に呼び出されるため、InvokeRepeatingを使用する必要はありません。そして、あなたの質問に答えるために、OnCollisionWallR(Collider2D colR)をOnCollisionEnter2D(Collision2D colR)に変更しました。 –

+0

彼はすべてのフレームの入力をチェックしていますが、フレームごとに呼び出されるわけではありません。 InvokeRepeatingは、キーが押されたフレームでのみ呼び出されます。 –

答えて

0

UnityEngineを使用する。 using System.Collections;

パブリッククラスSquadMovement:MonoBehaviour {

float constantspeed = 3; 
float speed; 

//Key inputs 

void Update() { 

    transform.Translate (constantspeed * Time.deltaTime, 0, 0); 
    if (Input.GetKeyDown (KeyCode.D)) { 

     StopAllCoroutines(); 
     StartCoroutine (RightMovement(0f)); 
    } 

    if (Input.GetKeyDown (KeyCode.A)) { 

     StopAllCoroutines(); 
     StartCoroutine (LeftMovement(0f)); 
    } 
} 

//Movement itself (Right, Left) 

IEnumerator RightMovement (float Rloop) { 

    while (transform.position.x < Time.time * constantspeed + 6) { 

     speed = 10f; 
     transform.Translate (speed * Time.deltaTime, 0, 0); 
     yield return new WaitForSeconds (Rloop); 
    } 

    if (transform.position.x > Time.time * constantspeed + 5.9) { 

     StopAllCoroutines(); 
     StartCoroutine (LeftMovement (0f)); 
    } 
} 

IEnumerator LeftMovement (float Lloop) { 

    while (transform.position.x > Time.time * constantspeed -8) { 

     speed = -7f; 
     transform.Translate (speed * Time.deltaTime, 0, 0); 
     yield return new WaitForSeconds (Lloop); 
    } 
} 

}

関連する問題