2016-04-22 7 views
-1

Ich arbeite an einem 2D-Spiel und jetzt bin ich am Ende davon! (Glück). Aber ich kann es nicht in Android bewegen. Was ist falsch im folgenden Code?Spieler Bewegung Touch-Eingabe

Wenn ich die Anwendung in der UNITY-Konsole ausgeführt wird, wirft keine Fehler.

using UnityEngine; 
    using System.Collections; 

    public class Bee : MonoBehaviour { 

     public float velocity; 

     public Transform bee; 
     private Animator animator; 

     public bool isGrounded = true; 
     public float force; 

     public float jumpTime = 0.4f; 
     public float jumpDelay = 0.4f; 
     public bool jumped = false; 
     public Transform ground; 

     private Gerenciador gerenciador; 

     // Use this for initialization 
     void Start() 
     { 
      gerenciador = FindObjectOfType (typeof(Gerenciador)) as Gerenciador; 
      animator = bee.GetComponent<Animator>(); 
      gerenciador.StartGame(); 

     } 

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

      Move(); 

     } 



     void Move() 
     { 

      isGrounded = Physics2D.Linecast (bee.transform.position, ground.position, 1 << LayerMask.NameToLayer ("Floor")); 

      foreach (UnityEngine.Touch touch in Input.touches) { 

       if (this.GetComponent<GUITexture>().HitTest (touch.position)) { 

        if (touch.phase != TouchPhase.Ended) { 

         if (this.name == "Right") { 

          animator.SetBool ("Run", true); 
          bee.transform.Translate (Vector2.right * velocity* Time.deltaTime); 
          bee.transform.eulerAngles = new Vector2 (0, 0); 
         } 

         if (this.name == "Left") { 

          animator.SetBool ("Run", true); 
          bee.transform.Translate (Vector2.right * velocity* Time.deltaTime); 
          bee.transform.eulerAngles = new Vector2 (0, 180); 
         } 

         if (this.name == "Up" && isGrounded && !jumped) { 

          animator.SetTrigger ("JumpB"); 
          bee.GetComponent<Rigidbody2D>().AddForce (transform.up * force); 
          jumpTime = jumpDelay; 
          jumped = true; 
         } 
        } 

        if (touch.phase == TouchPhase.Ended) { 
         animator.SetBool ("Run", false); 


        } 
       } 
      } 


      if (jumpTime >= 0f) { 
       jumpTime -= Time.deltaTime; 
      } 

      if (jumpTime <= 0 && isGrounded && jumped) { 

       animator.SetTrigger ("groundB"); 
       jumped = false; 
      } 
     } 
+3

Versuchen Sie, Ihren Code zu debuggen Mit Unity Remote können Sie es bei Google Play finden. Diese App ermöglicht es Ihnen, Berührungen im Unity Editor zu debuggen. –

+1

Nur eine kleine Sache, wenn Sie jemals daran denken, dies auf den PC zu portieren, ist es eine schlechte Idee, Ihre Bewegung auf Ihre Bildrate abzustimmen! – Draken

+0

@Draken wenn für Android =] –

Antwort

0

Ich denke, Ihr Code hält die Bewegung Teil Aufruf und es vermasselt den Code, weil Sie überprüfen nicht, ob es der Beginn des touchPhase ist.

Also, wenn der Benutzer die Taste berührt, wird die Move Methode für jeden Frame genannt und weil touchPhase nicht beendet ist (Spieler noch berührt), übergibt er diese Zeile if (touch.phase != TouchPhase.Ended).

Das bedeutet, dass dieser Teil für alle Frames genannt wird immer während Spieler noch die GUItexture zu berühren, und ich denke, dass Sie nur die Bewegung tun sollte, wenn die touchPhase begonnen hat:

if (touch.phase == TouchPhase.Began) { 
    if (this.name == "Right") { 
     animator.SetBool ("Run", true); 
     bee.transform.Translate (Vector2.right * velocity* Time.deltaTime); 
     bee.transform.eulerAngles = new Vector2 (0, 0); 
    } 
    if (this.name == "Left") { 
     animator.SetBool ("Run", true); 
     bee.transform.Translate (Vector2.right * velocity* Time.deltaTime); 
     bee.transform.eulerAngles = new Vector2 (0, 180); 
    } 
    if (this.name == "Up" && isGrounded && !jumped) { 
     animator.SetTrigger ("JumpB"); 
     bee.GetComponent<Rigidbody2D>().AddForce (transform.up * force); 
     jumpTime = jumpDelay; 
     jumped = true; 
    } 
}