c# - 当一个变量被一个脚本而不是另一个脚本激活时 If 语句起作用

标签 c# visual-studio unity3d

基本上,我使用的是 Unity C#,(我是新手,所以我可能遗漏了一些明显的东西),并且我有一个脚本,它使用 Raycast 与 NPC“交谈”。

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

好的,根据我的调试,这同样也能正常工作,我的问题似乎发生在更远的地方。

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

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

我试过很多东西,我试过改变我激活变量的方式(尽管它不是问题开始的地方)我试过删除它们,复制它们,使它们具有相同的名称,但是然后 splinter 的 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) 语句激活它下面的代码,在一种情况下它会激活它,但在另一种情况下不会。

最佳答案

您的脚本似乎在做一些相互冲突的事情。

这部分:

 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每一步的状态

关于c# - 当一个变量被一个脚本而不是另一个脚本激活时 If 语句起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57599890/

相关文章:

visual-studio - 有没有办法从项目文件中覆盖 $(VCTargetsPath) ?

c# - 如何一次将预制件添加到列表中

c# - 压缩 if-elseif-else 语句以节省比较

c# - 锁定数据库,使用 C#

c# - asp.net 网络服务 (.asmx)

c# - 为什么我不能使用参数字符串来命名我的按钮?

javascript - Visual Studio 2017 中背景 javascript 的颜色设置名称

c# - 确定文件夹是否在 .NET 中共享

visual-studio - 使用批处理文件在当前文件夹中运行 Visual Studio 代码

c# - Unity - "SetDestination"只能在已放置在 NavMesh 上的事件代理上调用。 UnityEngine.NavMeshAgent :SetDestination(Vector3)