调用OnTriggerStay()时检查按键

时间:2017-06-21 19:15:58

标签: c# unity3d unity5

我有一个NPC,当玩家对撞机与NPC发生碰撞时我的玩家可以与之交谈,我使用这段代码做到了这一点:

private void OnTriggerStay2D(Collider2D other)
{
    if (other.gameObject.tag == "InteractiveArea")
    {
        if (Input.GetKeyDown(KeyCode.E))
        {
            Debug.Log("PRESSED NPC");
            CreateAndShowDialog();
        }
    }
}

然而,这被称为真正随机,有时我第一次按" E"有时是第二次或第三次等等。

我的刚体:

enter image description here

enter image description here

我使用的对手是标准的BoxCollider2D,我的玩家对手是一个触发器,NPC不是。

为什么在OnTriggerStay功能中未检测到某些按键?

2 个答案:

答案 0 :(得分:1)

随机调用

OnTriggerStay2D。这就是为什么你永远不应该检查它内部的输入。

truefalse函数中设置为OnTriggerEnter2DOnTriggerExit2D的标记,然后在Update函数中检查该标志并输入叫每一帧。另外,请始终使用CompareTag代替other.gameObject.tag来比较代码。

private void Update()
{
    if (Input.GetKeyDown(KeyCode.E) && triggerStay)
    {
        //
    }
}

bool triggerStay = false;

void OnTriggerEnter2D(Collider2D collision)
{
    Debug.Log("Entered");
    if (collision.gameObject.CompareTag("InteractiveArea"))
    {
        triggerStay = true;
    }
}

void OnTriggerExit2D(Collider2D collision)
{
    Debug.Log("Exited");
    if (collision.gameObject.CompareTag("InteractiveArea"))
    {
        triggerStay = false;
    }
}

答案 1 :(得分:1)

我的猜测是因为Input.GetKeyDown is only true for the single (Update()) frame that the key was pressed返回的值,而物理(包括OnTriggerStay)在物理帧期间调用,即FixedUpdate()

做一些研究我提出this question,这表明:

  

我整个下午一直在努力解决这个问题!

     

我的OnTriggerStay和Update / FixedUpdate方法不同步,导致瞬间不受欢迎的影响。

     

当我在OnTriggerStay文档中读到这个函数可以是一个共同例程时,我终于找到了解决方案。我只是在我的OnTriggerStay中的正确位置添加了WaitForFixedUpdate并且它有效。它们现在彼此同步运行。这甚至可以解决更新中的问题。

Another question将此作为解决方案(程序员的回答):

  

OnTriggerStay不会调用每一帧。解决这个问题的一种方法是使OnTriggerEnter和OnTriggerExit设置一个bool。然后在FixedUpdate()中执行代码。

虽然文档不再说this post所说的内容,但

  

每个FixedUpdate都会调用OnTriggerStay。

     

“注意:OnTriggerStay函数在物理计时器上,因此无需每帧运行。”

这证实了我的猜测,并且由于某些无法解释的原因,文档已更改为不再包含此注释。