2017-04-11 124 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. 在事件发生时启用聊天对话框,并在特定时间后禁用聊天对话框。