2016-04-20 9 views
1

Ich mache einfaches Spiel, in dem ein Spieler berührt irgendwo auf dem Bildschirm etwas zu tun. Es ist eine Art Reflexspiel. Zur gleichen Zeit habe ich einen Knopf auf dem Bildschirm, mit dem man ein Spiel pausieren kann. Das Problem ist, dass wenn ich einen Knopf berühre, ein Spiel gleichzeitig eine Bildschirmberührung erkennt und ich das gerne vermeiden möchte. Ich verwende einen booleschen Wert, den ich beim Drücken der Taste ändere, aber er funktioniert immer noch nicht richtig - das Spiel wird nur einen Bruchteil der Sekunde pausiert, nachdem die Bildschirmberührung erkannt wurde.Unterscheiden Sie zwischen Taste berühren und Bildschirm berühren

Meine Pause Spielcode:

GameControlerScript: 

public static bool isPaused; 
public void PauseGame() 
    { 
     isPaused = true; // this is static 
     Time.timeScale = 0.0f; 

     //more code here 

    } 

und meine Berührungserkennung in unterschiedlichen Objekt angebracht Skript:

void Update() 
    { 

     if (((Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Began) || (Input.GetKeyDown(KeyCode.Space))) && !GameControllerScript.isPaused) 
     { 
      // code here starts to be executed and then pasues because of timescale 
     } 

    } 

So gibt es eine Möglichkeit, die Änderung der isPaused boolean zu machen, bevor es erkennt scrren touch?

+0

diese beiden Funktionen in der gleichen Klasse/Spielobjekt sind? Weil du einfach einen Text hinzufügen kannst, der ifPased == true ist, gib einfach zurück; s damit der nächste Code nicht ausgeführt wird ... Fehle ich etwas? –

+0

Das ist die Sache, dass beide Codes an verschiedene Objekte angehängt sind. Das erste ist ein Skript der Art des Spielmanagers, das eine Spiellogik enthält, und das zweite ist dem Objekt beigefügt, das während des Spiels instanziiert wird (aber immer nur eines dieser Art). Wenn es ein Spielobjekt wäre, würde ich alles in ein Skript schreiben und mit einfachen booleschen Werten arbeiten, aber nicht in diesem Fall –

+0

wenn Sie ein Game Manager Objekt haben (sagen wir es hat eine Komponente namens GameManager und innerhalb dieser Komponente gibt es den booleschen Wert isPause). Machen Sie den Boolean nicht statisch und öffentlich, dann können Sie mit GameObject.Find ("game manager") auf das andere Objekt zugreifen. GetComponent () .isPaused –

Antwort

2

überprüfen Sie Ihre Berührung auf dem UI-Element ist dann, wenn es nicht nennen ist welche Methode Sie für die normale Eingabe rufen

public void Update() 

{ 
    foreach (Touch touch in Input.touches) 
    { 
     if (EventSystem.current.IsPointerOverGameObject(touch.fingerId)) 
     { 
      // you touched at least one UI element 
      return; 
     } 
    } 

    // you didnt touched any UI element 
    // Do Something 
} 
+0

Seltsam, wenn ich es gemacht habe: 'if (((Input.touchCount> 0 && Input.GetTouch (0) .phase == TouchPhase.Began) || (Input.GetKeyDown (KeyCode.Space))) &&! GameControllerScript.isPaused &&! EventSystem.current.IsPointerOverGameObject()) 'Es hat nicht funktioniert, aber es funktioniert mit Ihrem Code. :) Vielen Dank! –