关于 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;
}
直奔主题,我在处理这段代码时遇到了一些问题。 似乎一旦我按下可交互键(“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;
}