为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
叮当猫咪 2023-09-16 16:20:16
本质上,我使用的是 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) 语句激活其下面的代码,它在一种情况下做到了,但在另一种情况下则不然。
查看完整描述

1 回答

?
SMILET

TA贡献1796条经验 获得超4个赞

看起来你的脚本做了一些相互冲突的事情。


这部分:


 if (Interacting == true)

    {

        Debug.Log("Test1");

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

    }

    else 

    {

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

    }

这将在层次结构中较高的脚本上正常工作。当第二个脚本尝试在 if = true 时执行某些操作时,第一个脚本会通过其else. 因此,当第二个脚本尝试执行时obj.GetComponent<NPCMasterScr> ().DialogueActive = true;,第一个脚本就会执行obj.GetComponent<NPCMasterScr> ().DialogueActive = false;。


更新1: 以下代码可能有助于理解问题。


void Update()

{

    if (Interacting == true)

    {

        Debug.Log("Test1");

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

    }

    if (Input.GetKeyDown("escape"))

    {

        Interacting = false;

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

    }

}

如何使用:

  • 与第一个对象交互

  • 停止互动

  • 按 Esc(执行此步骤之前应停止交互!)

  • 与第二个对象交互

...以及DialogueActive每个步骤的控制状态


查看完整回答
反对 回复 2023-09-16
  • 1 回答
  • 0 关注
  • 39 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信