猿问

当一个变量被一个脚本激活而不是另一个脚本激活时,if 语句起作用

本质上,我使用的是 Unity C#(我很新,所以我可能会遗漏一些明显的东西),并且我有一个脚本,它使用 Raycast 与 NPC“对话”。


本质上,它所做的就是 Raycast 拾取与其碰撞的物体,然后打开该对象内的“NPC”脚本。我这样做是为了区分 NPC,因为将来我可以使用序列化更改不同 NPC 的代码。


好吧,根据我的调试,这也可以正常工作,我的问题似乎正在进一步发生。


然后,这个 NPC 脚本会激活另一个名为“DialogueActive”的“NPCMaster”脚本上的变量。根据我的调试,这也有效,问题是,尽管我的两个 NPC 几乎完全相同,并且都正确激活了这个变量,但其中一个不会激活 if 语句检查“DialogueActive”== true 。


奇怪的是,当我将它们的名字更改为相同的名称,或者完全更改它们的名称,或者删除并复制预制件时,损坏的 NPC 就会发生变化。然而,一旦我放置它们,一个 NPC 就会被破坏,而另一个则不会,这并不取决于我首先与谁交谈或其他任何事情。我可以与未损坏的 NPC 交谈任意多次,而且它总是有效的。


我尝试过很多事情,我尝试过更改激活变量的方式(尽管它不是问题开始的地方)我尝试过删除它们,复制它们,使它们具有相同的名称,但随后损坏的 NPC 将只是交换位置。


就像我说的,我对 C# unity 很陌生,而且总体上对编码很陌生,所以问题可能是由于我的无知造成的。


//出现问题的if语句。


void Update()

{

    if (DialogueActive == true)

    {

        Debug.Log("Test2");

        panelexist.enabled = true;


        maintext.text = dialogue;

    }

    else

    {

        panelexist.enabled = false;

        maintext.text = ""; 

    }

}

//激活“DialogueActive”变量的变量。


void Update()

{

    if (Interacting == true)

    {

        Debug.Log("Test1");

        obj.GetComponent<NPCMasterScr> ().DialogueActive = true;

    }

    else 

    {

        obj.GetComponent<NPCMasterScr> ().DialogueActive = false;

    }

    if (Input.GetKeyUp("escape"))

    {

        Interacting = false;

        obj.GetComponent<NPCMasterScr> ().DialogueActive = false;

    }

}

我期望 if (DialogueActive == true) 语句激活其下面的代码,它在一种情况下做到了,但在另一种情况下则不然。


叮当猫咪
浏览 79回答 1
1回答

SMILET

看起来你的脚本做了一些相互冲突的事情。这部分:&nbsp;if (Interacting == true)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; Debug.Log("Test1");&nbsp; &nbsp; &nbsp; &nbsp; obj.GetComponent<NPCMasterScr> ().DialogueActive = true;&nbsp; &nbsp; }&nbsp; &nbsp; else&nbsp;&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; obj.GetComponent<NPCMasterScr> ().DialogueActive = false;&nbsp; &nbsp; }这将在层次结构中较高的脚本上正常工作。当第二个脚本尝试在 if = true 时执行某些操作时,第一个脚本会通过其else. 因此,当第二个脚本尝试执行时obj.GetComponent<NPCMasterScr> ().DialogueActive = true;,第一个脚本就会执行obj.GetComponent<NPCMasterScr> ().DialogueActive = false;。更新1: 以下代码可能有助于理解问题。void Update(){&nbsp; &nbsp; if (Interacting == true)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; Debug.Log("Test1");&nbsp; &nbsp; &nbsp; &nbsp; obj.GetComponent<NPCMasterScr> ().DialogueActive = true;&nbsp; &nbsp; }&nbsp; &nbsp; if (Input.GetKeyDown("escape"))&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; Interacting = false;&nbsp; &nbsp; &nbsp; &nbsp; obj.GetComponent<NPCMasterScr> ().DialogueActive = false;&nbsp; &nbsp; }}如何使用:与第一个对象交互停止互动按 Esc(执行此步骤之前应停止交互!)与第二个对象交互...以及DialogueActive每个步骤的控制状态
随时随地看视频慕课网APP
我要回答