我有一个NPC,当玩家对撞机与NPC发生碰撞时我的玩家可以与之交谈,我使用这段代码做到了这一点:
private void OnTriggerStay2D(Collider2D other)
{
if (other.gameObject.tag == "InteractiveArea")
{
if (Input.GetKeyDown(KeyCode.E))
{
Debug.Log("PRESSED NPC");
CreateAndShowDialog();
}
}
}
然而,这被称为真正随机,有时我第一次按" E"有时是第二次或第三次等等。
我的刚体:
我使用的对手是标准的BoxCollider2D,我的玩家对手是一个触发器,NPC不是。
为什么在OnTriggerStay
功能中未检测到某些按键?
答案 0 :(得分:1)
OnTriggerStay2D
。这就是为什么你永远不应该检查它内部的输入。
在true
和false
函数中设置为OnTriggerEnter2D
和OnTriggerExit2D
的标记,然后在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函数在物理计时器上,因此无需每帧运行。”
这证实了我的猜测,并且由于某些无法解释的原因,文档已更改为不再包含此注释。