统一二维。为什么两种可能的动作都是通过按下按钮触发的?
Unity 2D. Why both possible actions are triggered by pressing button?
我试图让玩家在与开门器发生碰撞时关门和开门成为可能。但它只是两者兼而有之——通过按 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;
}
}
}
您的代码从上到下是 运行。它从第一行 运行 开始,到第二行,依此类推。您正在检查门是否关闭然后打开它,然后在下一行中您正在检查它是否打开然后关闭它。这会导致门打开然后关闭。
解决方案:您可以轻松地交换两个 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;
}
}
}
解释了这个问题 - 您的代码从上到下运行,因此在执行第一个代码块后,您也会进入第二个条件。
然而,它仍然容易出错。
您实际上应该做的是使用 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;
}
}
我试图让玩家在与开门器发生碰撞时关门和开门成为可能。但它只是两者兼而有之——通过按 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;
}
}
}
您的代码从上到下是 运行。它从第一行 运行 开始,到第二行,依此类推。您正在检查门是否关闭然后打开它,然后在下一行中您正在检查它是否打开然后关闭它。这会导致门打开然后关闭。
解决方案:您可以轻松地交换两个 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;
}
}
}
然而,它仍然容易出错。
您实际上应该做的是使用 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;
}
}