我正在嘗試在玩家與開門器碰撞時關閉和打開門。但它只是兩者兼而有之 - 按 E 鍵打開和關閉。似乎是什么問題?
{
bool DoorTriggered = false;
bool DoorClosed = true;
[SerializeField] private DoorOpener door;
private void Update()
{
if (Input.GetKeyDown(KeyCode.E) && DoorTriggered && DoorClosed)
{
door.OpenDoor();
DoorClosed = false;
}
if (Input.GetKeyDown(KeyCode.E) && DoorTriggered && !DoorClosed)
{
door.CloseDoor();
DoorClosed = true;
}
}
private void OnTriggerEnter2D(Collider2D collision)
{
if (collision.TryGetComponent(out PlayerScript _player))
{
DoorTriggered = true;
}
}
private void OnTriggerExit2D(Collider2D collision)
{
if (collision.TryGetComponent(out PlayerScript _player))
{
DoorTriggered = false;
}
}
}
uj5u.com熱心網友回復:
您的代碼從上到下運行。它從運行第一行開始,到第二行,依此類推。您正在檢查門是否關閉然后打開它,然后在下一行檢查它是否打開,然后關閉它。這會導致門打開然后關閉。
解決方案:您可以輕松地交換兩個 if 陳述句的位置,盡管這可能會導致一些錯誤。我們可以使用 if-else 陳述句來確保您獲得所需的解決方案,而不是簡單地交換兩者。
{
bool DoorTriggered = false;
bool DoorClosed = true;
[SerializeField] private DoorOpener door;
private void Update()
{
if (Input.GetKeyDown(KeyCode.E) && DoorTriggered && DoorClosed)
{
door.OpenDoor();
DoorClosed = false;
}
else
{
door.CloseDoor();
DoorClosed = true;
}
}
private void OnTriggerEnter2D(Collider2D collision)
{
if (collision.TryGetComponent(out PlayerScript _player))
{
DoorTriggered = true;
}
}
private void OnTriggerExit2D(Collider2D collision)
{
if (collision.TryGetComponent(out PlayerScript _player))
{
DoorTriggered = false;
}
}
}
uj5u.com熱心網友回復:
這個答案解釋了這個問題 - 您的代碼從上到下運行,因此在執行第一個代碼塊后,您也輸入了第二個條件。
但是,它仍然容易出錯。
您實際上應該做的是使用if - else專門呼叫您的代碼塊,例如
private void Update()
{
if (Input.GetKeyDown(KeyCode.E) && DoorTriggered)
{
if(DoorClosed)
{
door.OpenDoor();
DoorClosed = false;
}
else
{
door.CloseDoor();
DoorClosed = true;
}
}
}
或者也
private void Update()
{
if (Input.GetKeyDown(KeyCode.E) && DoorTriggered)
{
if(DoorClosed)
{
door.OpenDoor();
}
else
{
door.CloseDoor();
}
DoorClosed = !DoorClosed;
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/447768.html
上一篇:如何在c#中用字符填充鋸齒狀陣列
下一篇:字典和物件的模型創建問題
