【问题标题】:If statement working when a variable is activated by one script, but not another当一个脚本激活一个变量而不是另一个脚本时,if 语句起作用
【发布时间】:2019-08-21 22:26:54
【问题描述】:

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

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

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

这个 NPC 脚本然后激活另一个我的“NPCMaster”脚本上的一个变量,称为“DialogueActive”。根据我的调试,这也有效,问题是,尽管我的两个 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) 语句激活它下面的代码,它在一种情况下会这样做,但在另一种情况下不会。

【问题讨论】:

  • 愿意向我们展示您对 DialogueActive 的声明吗?一个 MCVE 会很好
  • 不知道什么是“MCVE”,但这是在我的 NPCMaster 脚本中声明 DialogueActive 的地方。 public bool DialogueActive = false;
  • 这一行:obj.GetComponent&lt;NPCMasterScr&gt; ().DialogueActive = false; 包含什么脚本? “NPC”?
  • @Nitro557 这是由“NPC”脚本完成的,它正在更改 DialogueActive 变量,该变量在“NPCMaster”脚本中说明,该脚本包含 if 语句,使用 DialogueActive多变的。我已经在我的原始帖子中放置了这个 if 语句。如果你愿意,我可以发布整个脚本,但它大多不相关。
  • @LiamMcCoy,好的。那么,您目前在现场有 2 个带有 NPCMasterScr 的对象?

标签: c# visual-studio unity3d


【解决方案1】:

似乎您的脚本做了一些冲突的事情。

这部分:

 if (Interacting == true)
    {
        Debug.Log("Test1");
        obj.GetComponent<NPCMasterScr> ().DialogueActive = true;
    }
    else 
    {
        obj.GetComponent<NPCMasterScr> ().DialogueActive = false;
    }

这将在层次结构中较高的脚本上正常工作。 当第二个脚本在 if = true 时尝试做某事时,第一个脚本通过其else 阻止此操作。因此,当第二个脚本尝试obj.GetComponent&lt;NPCMasterScr&gt; ().DialogueActive = true; 时,第一个脚本执行obj.GetComponent&lt;NPCMasterScr&gt; ().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 状态

【讨论】:

  • 谢谢!那我该怎么做呢?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-07
  • 1970-01-01
  • 1970-01-01
  • 2015-09-04
  • 1970-01-01
  • 2020-06-09
相关资源
最近更新 更多