unity3d if else语句无法正常工作unity 3d

bf1o4zei  于 2022-11-25  发布在  其他
关注(0)|答案(1)|浏览(282)
void OnTriggerStay(Collider player)
    {
        if (player.gameObject.tag == "Player")
        {
             if (Input.GetKeyDown("g")) //If G is pressed
                 {
                      if (!G1.activeInHierarchy)
                         {
                             G1.SetActive(true);    
                         }
                      else if (G1.activeInHierarchy)
                         {
                             G1.SetActive(false);
                            G2.SetActive(true);
                         }
  
                 }
        }
    }

当运行此代码并单击G按钮时,它会同时激活G1和G2。但首先应该是G1,然后再次单击G按钮,然后应该打开G2。

wlsrxk51

wlsrxk511#

首先,else语句永远不会发生。在truefalse之外的其他地方不可能有布尔值,您在ifelse if中已经讨论过了。
第二,你的逻辑可以被简化。你的程序员声明你想要以下行为:

  • 如果G1处于活动状态,则将其禁用。如果G1处于禁用状态,则将其激活-这意味着我们每次只需切换活动状态
  • 如果G1处于活动状态,我们希望激活G2-这意味着我们需要一个if语句来激活G2
  • else-statement从不执行,可以删除
if (Input.GetKeyDown("g"))
{
    if (G1.activeInHierarchy)
    {
        G2.SetActive(true);
    }
    
    G1.SetActive(!G1.activeInHierarchy);
}

现在回答你的问题
可能有很多原因。也许这个脚本附加到很多组件,所以它被执行了很多次?这就解释了为什么两个都被激活,因为逻辑当前是:
G -〉G1激活
G -〉G1不活动,G2活动
G -〉G1激活,G2仍激活
如果您希望在第三次单击时停用G2,则需要在激活G1时执行G2.SetActive(false)
如果你想要一个点击G在两个游戏对象之间切换的行为,你可以简单地做...

if (Input.GetKeyDown(KeyCode.G))
{
    G1.SetActive(!G1.activeInHierarch);
    G2.SetActive(!G2.activeInHierarch);
}

假定其中一个从一开始就处于活动状态,则将产生以下行为:
G1:激活
G2.不活动
点击G
G1:未激活
G2:激活
点击G
G1:激活
G2:不活动
...等等
要在对代码进行最少更改的情况下获得所需的行为,只需将else-code移动到第一个if:

if (Input.GetKeyDown(KeyCode.G))
{
    if (!G1.activeInHierarchy)
    {
        G1.SetActive(true);
        G2.SetActive(false);
    }
    else if (G1.activeInHierarchy)
    {
        G1.SetActive(false);
        G2.SetActive(true);
    }
}

当然可以简化为...

if (Input.GetKeyDown(KeyCode.G))
{
    G1.SetActive(!G1.activeInHierarchy);
    G2.SetActive(G1.activeInHierarchy);
}

相关问题