2017-04-11 2 views
0

Ich erstelle ein Dialogsystem auf Einheit, wo der Benutzer Optionen zur Auswahl hat und entweder eine Antwort über ein Textfeld erhält oder mehr Optionen zur Auswahl bekommt.Unity Update-Methode gleiche Tasteneingabe zweimal

Zuerst habe ich 3 Möglichkeiten. Diese 3 Optionen gehören zu einem Skript und weitere 2 Optionen gehören zu einem anderen, die beide gleichzeitig ausgeführt werden. Jede Option hat einen int-Index (erste Option = 0, zweite Option = 1 usw.). Ich habe es so gemacht, dass, wenn ich auf Option 1 drücke, der Index 3 wird, um zur vierten Option zu gehen. Da ich alles in Update gesetzt habe, um auf die Eingabe des Schlüssels durch den Benutzer zu warten, wird der Benutzer, wenn er die Eingabetaste drückt, von beiden Skripten ausgeführt, so dass beide Anweisungen gleichzeitig eingegeben werden.

Was passiert im Grunde, wenn i Option 1 wählen, im die Antwort von Option 4 sofort bekommen, weil, wenn ich sie ausgeführt von beiden Skripten Enter drücken

Wie kann ich es so, dass, wenn ich die Eingabetaste drücken für Option 1 Es ignoriert die andere Aussage bitte. Screenshots unten.

 if (Input.GetKey (KeyCode.Return)) { 

      if (indexConversation == 0) { 
       Debug.Log("first Option"); 


       // GameObject.Find("Scripts2").SetActive(true); 

       telResponse.text = "Response 1"; 
       Conv1Controller.Conv1showConversation = true; 
       indexConversation = 3; 
       Debug.Log (indexConversation); 

      } else if (indexConversation == 1) { 

       Debug.Log("second Option"); 
       telResponse.text = "Response 2"; 
       StartCoroutine(responseTwoFollowedbySix()); 
      } 

      else if (indexConversation == 2) { 

       Debug.Log("third Option"); 
       telResponse.text = "Response 3"; 
       StartCoroutine(responseThreeFollowedbyFourFollowedbySeven()); 
      } 

      showConversation = false; 

     } 

Das andere Skript (Option 4 und 5)

if (Input.GetKey(KeyCode.Return)) 
     { 
      if (DialogueController.indexConversation == 3) 
      { 
       Debug.Log("Fourth Option"); 
       telResponse.text = "Response 4"; 


      } 


      if (DialogueController.indexConversation == 4) 
      { 

       Debug.Log("Option 5"); 
       telResponse.text = "Response 5"; 
      } 

      //Conv1showConversation = false; 


     } 
+3

Veröffentlichen Sie Ihren Code nicht als Screenshots. Kopiere und poste diesen Code in deiner Frage. – Programmer

+0

Gibt es keine Möglichkeit, sie in dasselbe Skript zu schreiben? – CNuts

+0

Ich setze sie in separate Skripte, weil sie die gleichen Methoden nur Option 4 und 5 anders haben und auch ich kann nicht 2 OnGUI richtig haben? –

Antwort

0

Betrachtet Ihr erstes Skript hat eine indexConversation Variable und Ihre zweite Skript scheint es mit DialogueController.indexConversation Bezug zu nehmen, fühle ich mich wie diese Variable a public static int eins. In dieser Situation könnte man einfach etwas tun:

erste Skript

[SerializeField] 
private YOUR_OTHER_SCRIPT_CLASS otherScript; 

if (Input.GetKey(KeyCode.Return)) 
{ 
    showConversation = false; 
    switch(indexConversation) 
    { 
     case 0: 
      Debug.Log("first Option"); 
      telResponse.text = "Response 1"; 
      Conv1Controller.Conv1showConversation = true; 
      indexConversation = 3; 
      Debug.Log (indexConversation); 
      break; 

     case 1: 
      Debug.Log("second Option"); 
      telResponse.text = "Response 2"; 
      StartCoroutine(responseTwoFollowedbySix()); 
      break; 

     case 2: 
      Debug.Log("third Option"); 
      telResponse.text = "Response 3"; 
      StartCoroutine(responseThreeFollowedbyFourFollowedbySeven()); 
      break; 

     default: 
      otherScript.ReturnKeyPressed(); 
      break; 
    } 
    showConversation = false; 
} 

Hier habe ich eine Variable Ihre anderen Skript zu verweisen und verwendet, um eine switch Anweisung, die viele if und else if zu vermeiden. Auch wenn der Wert indexConversation nicht 1, 2 oder 3 ist, bitten Sie Ihren anderen Scrip, etwas zu tun.

Andere Skript

public void ReturnKeyPressed() 
{ 
    switch(DialogueController.indexConversation) 
    { 
     case 3: 
      Debug.Log("Fourth Option"); 
      telResponse.text = "Response 4"; 
      break; 

     case 4: 
      Debug.Log("Option 5"); 
      telResponse.text = "Response 5"; 
      break; 

     default: 
      break; 
    } 
} 

In diesem Skript gibt es nicht mehr if (Input.GetKey(KeyCode.Return)) da die Eingangserkennung wird im ersten Skript gemacht werden und zu diesem Skript senden, wenn nötig.

P.-S.

  • Wie @Programmer sagte, man kann nie OnGUI() für etwas anderes als das Debuggen verwendet werden soll. Diese Methode ist wirklich schwer, da sie oft pro Frame aufgerufen wird (was nutzlos ist) und Sie können einfach Unity UI System verwenden, um mit UI zu arbeiten.
  • Wie von @Nabren vorgeschlagen, sollte Ihr System, wenn es komplexer ist als dieser einfache Fall, wirklich die Art ändern, wie es erstellt wurde, und eine Input Manager-Klasse haben, die Eingaben erhält und an die entsprechenden Skripte sendet.

hoffe, das hilft,

0

Sie wirklich über die Speicherung Ihrer Gespräche in ein Modell denken sollte, die einen Link zu Antworten und Antworten haben auf spezifische „Follow-Up“ Gespräch verknüpfen.Auf diese Weise können Sie das Skript so agnostisch wie möglich schreiben. Sie geben nur eine Antwort und es weiß, wie man damit umgeht. Jede Antwort würde ihr eigenes "ResponseView" -Skript erhalten, das ein Antwortmodell aufnimmt und Knopf-Listener oder Schlüssel-Listener für Presseereignisse hinzufügen könnte und dann beim Empfang der richtigen Eingabe die nächste Konversation unter Verwendung ihres aktuellen Antwortmodells laden würde. Das Schreiben spezifischer Methoden im Code, um Ihren Antworten zu sagen, wohin sie gehen müssen, ist sehr sehr zerbrechlich und lässt sich nicht gut skalieren.

Verwandte Themen