2017-04-11 157 views
0

我正在嘗試進行統一聊天對話,當與對象碰撞並按下某個按鍵時應顯示該對話框。聊天對話應保持到碰撞退出。問題在於聊天對話在衝突時按鍵顯示,但在同一秒內變爲錯誤,因此閃爍。布爾正在重置,而不是在碰撞時保持爲真。統一聊天對話框系統

 hitColliders = Physics.OverlapSphere(transform.position, 5f); 
    int i = 0; 
    while (i < hitColliders.Length) { 

     if (hitColliders [i].gameObject.tag == "gameobjectCollision") { 

      if (Input.GetKey (KeyCode.F)) { 
       Debug.Log ("pressed F"); 
       DialogueController.showConversation = true; 

      } 

      break; 
     } 

     else { 

      Debug.Log ("Conversation Off"); 
      DialogueController.showConversation = false; 
     } 

     i++; 
    } 

此外,正在正確連接腳本和網格碰撞器與碰撞遊戲對象設置。謝謝。

回答

0

你應該真的考慮關閉觸發器而不是碰撞。因此,爲每個NPC製作一個單獨的觸發器,您可以在遊戲中與之交談。然後在播放器腳本中使用OnTriggerEnter和OnTriggerExit。 OnTriggerEnter可以允許通過單擊按鈕啓動對話,然後使用OnTriggerExit可以關閉覆蓋。

public void Update() 
{ 
    if (inInteractRange && Input.GetKeyDown(KeyCode.E)) 
    { 
     DialogueSystemManager.Instance.StartDialogueForNpc(interactableNPCName); 
    } 
} 
private void OnTriggerEnter(Collider col) 
{ 
    inInteractRange = true; 
} 
private void OnTriggerExit(Collider col) 
{ 
    inInteractRange = false; 
    DialogueSystemManager.Instance.CloseDialogueWindow(); 
} 
+0

我實際上嘗試過使用觸發器,但碰撞是一種越野車,有時對話框打開有時沒有任何反應。使用目前的方法,更新檢查每幀的衝突 –

+0

是的,這在系統上確實非常昂貴。但是,如果你打算爲對話系統進行基於碰撞的檢測,你應該真正接入統一的OnCollisionEnter和OnCollisionExit事件。只需在該回調方法內部切換布爾值即可。 但是我在統一資產商店中有一個使用觸發器的對話管理系統,沒有人對觸發系統有任何問題。我建議使用觸發器的唯一原因是,當您有很多遊戲正在監控的對象時,它們在系統上花費較少。我更新了我的答案以顯示我使用的代碼 –

+0

如果要使用衝突事件而不是觸發器,請將OnTriggerEnter和OnTriggerExit更改爲OnCollisionEnter和OnCollisionExit。 –

0

你可以做以下

  1. 生成OnTriggerEnter的事件。
  2. 創建一個ChatDialogueHandler腳本併爲該事件添加監聽器。
  3. 在事件發生時啓用聊天對話框,並在特定時間後禁用聊天對話框。