为什么Unity SetActive不会在Input.GetButtonDown()中执行?

时间:2018-03-31 18:22:29

标签: c# unity3d

我完全被这一个难住了。我在游戏中有一本书,当你在它的一定距离内查看它的一般方向并按下动作按钮(e或鼠标左键单击)时,它应该显示一个UI面板(bookPage)。这是我的代码。

void Update () {
    Vector3 direction = player.transform.position - this.transform.position;
    angle = Vector3.Angle (direction, player.transform.forward);
    distance = direction.magnitude;
    if (angle >= 160 && distance <= 2 && !bookPage.activeSelf) {
        if(Input.GetButtonDown("Action")) {
            bookPage.SetActive (true);
        }
    }
    if (bookPage.activeSelf && Input.GetButtonDown("Action")) {
        bookPage.SetActive (false);
    }
}

这不起作用。具体来说,将页面设置为活动的行不起作用。如果它打开,它将正确关闭。如果我复制并粘贴bookPage.SetActive (true); 除了if(Input.getButtonDown("Action")){}之外,此方法中的任何地方都会激活bookPage。如果我将Debug.Log("message");放在if语句中,它将显示在控制台中。它只是将bookPage设置为活动的一行无法正常工作。我不知道为什么。我已经尝试将其移动到另一种方法,然后调用它并使用Coroutine进行相同操作。都没有奏效。我也尝试使用其他有效的键,但是我需要它来处理动作键。值得注意的是,操作键可用于其他用途。我已经用它来打开门了。还有其他人遇到这样的问题吗?

1 个答案:

答案 0 :(得分:1)

当您致电SetActive(true)时,activeSelf将为您的第二个条件返回true,该条件会立即调用SetActive(false)

改变这一点;

if (angle >= 160 && distance <= 2 && !bookPage.activeSelf)
{
    if (Input.GetButtonDown("Action"))
    {
        bookPage.SetActive(true);
    }
}
if (bookPage.activeSelf && Input.GetButtonDown("Action"))
{
    bookPage.SetActive(false);
}

对此;

if (angle >= 160 && distance <= 2 && !bookPage.activeSelf)
{
    if (Input.GetButtonDown("Action"))
    {
        bookPage.SetActive(true);
    }
}
else if (bookPage.activeSelf && Input.GetButtonDown("Action"))
{
    bookPage.SetActive(false);
}