2017-04-11 60 views
0

我正在創建一個對話框系統,用戶可以從中進行選擇,並通過文本字段獲取響應或獲取更多選項。Unity更新方法相同的鍵輸入兩次

起初我有3個選擇。這3個選項屬於一個腳本,另外兩個選項屬於另一個,它們都是同時運行的。每個選項都有一個int索引(第一個選項= 0,第二個選項= 1等)。我已經做到這一點,如果我按下選項1,索引變爲3,去第四個選項。 由於我已將Update中的所有內容都等待用戶的鍵輸入,因此每當用戶按下Enter鍵時,都會從兩個腳本中執行,因此它一次輸入兩個語句。

請告訴我發生的事情基本上當我選擇選項1,即時得到選項4的響應瞬間,因爲當我按下ENTER它從兩個腳本

我怎樣才能使它執行,這樣,當我按下了選擇1進入它請忽略其他聲明。下面的屏幕截圖。

 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; 

     } 

其他腳本(選項4和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

請勿將您的代碼作爲屏幕截圖發佈。在您的問題中複製併發布該代碼。 – Programmer

+0

你有沒有辦法將它們放在同一個腳本中? – CNuts

+0

我把他們在單獨的腳本,因爲他們有相同的方法只是選項4和5不同,也不能有2個OnGUI的權利? –

回答

0

考慮您的第一個腳本有一個indexConversation變量,而第二個腳本似乎是指它使用DialogueController.indexConversation來,我覺得這個變量是一個public static int one。在這種情況下,你可以簡單地做這樣的事情:

第一個腳本

[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; 
} 

這裏我添加了一個變量來引用您的其他腳本,並使用switch指令,以避免許多ifelse if。 另外,如果indexConversation的值不是1,2或3,則請求您的其他代碼執行某些操作。

其他腳本

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; 
    } 
} 

在此腳本中,沒有更多的if (Input.GetKey(KeyCode.Return))由於輸入檢測將在第一個腳本進行,如果需要發送給該腳本。

P.-S.

  • 作爲@Programmer說,你不應該使用OnGUI()任何東西比其他的調試。這種方法非常繁重,因爲它被稱爲每幀很多次(這是無用的),您可以使用Unity UI System輕鬆處理UI。
  • 正如@Nabren所說,如果你的系統比這個簡單的情況更復雜,你應該改變它的製作方式,並且有一個輸入管理器類來獲得輸入並將它們發送到適當的腳本。

希望這有助於

0

你真的應該考慮一下存儲你的談話成有一個鏈接,以響應和響應可以鏈接到特定的「後續」的對話模型。這樣,您可以儘可能將腳本編寫爲不可知的。你只是給它一個迴應,它知道如何處理它。每個響應都會得到自己的「ResponseView」腳本,該腳本接受響應模型,並可以爲按下事件添加按鈕監聽器或按鍵監聽器,然後在接收到正確的輸入時使用其當前響應模型加載下一個對話。用代碼編寫特定的方法來告訴你的迴應他們需要去的地方是非常脆弱的,並且不會很好地擴展。