关于 OnTriggerStay 和 Input.GetKeyDown

About OnTriggerStay and Input.GetKeyDown

直奔主题,我在处理这段代码时遇到了一些问题。 似乎一旦我按下可交互键(“E”)并且 InputGetKeyDown returns 为真,它在 OnTriggerStayMethod 的大约 6 次执行中保持为真,它们不同步,因此它破坏了我的代码。

预期行为: 当 isHiding 为 false 时玩家按下“E”并执行语句 1,因此 isHiding 设置为 true。 当 isHiding 为真且语句 2 执行时,玩家按下“E”,因此 isHiding 设置为假。

实际行为: 当 isHiding 为 false 时玩家按下“E”,语句 1 执行并将 isHiding 设置为 true 然后紧接着执行语句 2,因为 isHiding 被设置为 true 并且显然 return 的值 [=26] =] 对于少数 OnTriggerStay 执行帧仍然适用。这破坏了我的代码。

这是代码:

 private void OnTriggerStay()
    {   
        //Statement 1
        if (Input.GetKeyDown(interactableKey) && this.isLocker && !PlayerManager.Instance.isHiding)
        {
            PlayerManager.Instance.currentHidingSpot = this.gameObject;
            PlayerManager.Instance.PerformHide();//This sets isHiding to true
            return; // This should be preventing the next if statement from being evaluated
        }
        //Statement 2
        if (Input.GetKeyDown(interactableKey) && this.isLocker && PlayerManager.Instance.isHiding)
        {
            PlayerManager.Instance.PerformExitHide(); //This sets isHiding to false
        }
    }

如果这让您感到困惑,我很抱歉,我通常不会在这里提问,但我从来没有遇到过像这样的问题。告诉我你的想法。

每个 Unity Frame 可以多次调用 OnTriggerStay 方法。它在物理时钟周期而不是帧周期上运行。因此,您不会在此处使用 Input.GetKeyDown,因为 GetKeyDown 引用的是最后一帧中按下的键。

相反,尝试读取 Update 方法中的输入,然后在 OnTriggerStay 方法中执行您的操作,如下所示:

private bool allowInteraction;

private void Update ( )
{
    if ( Input.GetKeyDown ( interactableKey ) )
        allowInteraction = true;
}

private void OnTriggerStay ( )
{
    if ( allowInteraction && isLocker )
    {
        if ( PlayerManager.Instance.isHiding )
        {
            //Statement 2
            PlayerManager.Instance.PerformExitHide ( ); //This sets isHiding to false
        }
        else
        {
            //Statement 1
            PlayerManager.Instance.currentHidingSpot = this.gameObject;
            PlayerManager.Instance.PerformHide ( );//This sets isHiding to true
        }
    }
    allowInteraction = false;
}