统一二维。为什么两种可能的动作都是通过按下按钮触发的?

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;
    }
}