激活不活动的同名不同标记游戏对象

时间:2016-02-22 13:48:30

标签: unity3d

出于某种原因,我无法更改游戏对象(化身)的名称,但我需要有2个不同版本的游戏,并在代码中激活它们。

因此,复制头像不是一种选择,但我仍然需要创建一个相同的头像并在编辑器模式下进行更改,以便根据条件,一个选择了另一个

我想到,现在无法更改名称,也许我可以给另一个一个不同的标记,并根据所选方案激活正确的标记

所以,我查看了一些手册文档和一些论坛帖子,并提出了以下3个替代方案放在我的Start()中,但没有一个工作:

void Start()
{
    if ( GameObject.FindGameObjectWithTag("John") )
        gameObject.FindGameObjectWithTag("John").SetActive(true);

    if ( GameObject.FindWithTag("John") )
        gameObject.FindWithTag("John").SetActive(true);
}

有人可以帮我理解我做错了什么以及如何实现这个目的:找到一个不活跃的对象来自2个同名但不同的非活动对象标签:一个untagged,另一个标记为John

1 个答案:

答案 0 :(得分:3)

不能轻松,只需将它们分配给 不同的变量

public GameObject johnCharacterOnLeft;
public GameObject johnCharacterWhoJoinsLater;

void Start()
  {
  johnCharacterOnLeft.SetActive(true);
  johnCharacterOnLeft.Whatever(true);
  johnCharacterOnLeft.Whatever(true);
  johnCharacterOnLeft.Whatever(true);
  johnCharacterWhoJoinsLater.SetActive(false);
  johnCharacterWhoJoinsLater.Whatever(false);
  johnCharacterWhoJoinsLater.Whatever(false);
  ...
  }

请注意,作为一项规则,当您学习时, 使用“查找”。就这么简单。使用公共变量并拖动以在检查器中进行连接。

enter image description here

(如果有人在阅读时还不知道如何拖动连接,请检查任何基本的tutorial。)

如果您确实想要找到具有特定标记的所有对象

GameObject[] allCats;
allCats = GameObject.FindGameObjectsWithTag("cat");
foreach (GameObject g in allCats)
 Debug.Log("I found one, name is: " +g.name);

如果你想找到其中一个具有某个名字的 ,你必须全部搜索它们。

GameObject[] allCats;
allCats = GameObject.FindGameObjectsWithTag("cat");
foreach (GameObject g in allCats)
 {
 Debug.Log("I found one, name is: " +g.name);
 if ( g.name == "Felix" )
   {
   Debug.Log("I did find Felix the cat");
   g.Whatever ...
   }

如果您确实想要找到具有某个名称的所有对象 ...

了解这一点非常重要

...你不能在Unity中做到这一点 - 这根本没有意义。

生命的生命 - Find是一种你永远不应该真正使用的黑客,除了在极少数情况下。如果你(出于某种原因?)需要“找到”具有特定名称的所有游戏对象,你必须简单地查看场景中的每一件事(这不是特别容易做到的)。你可以轻松谷歌这个。但是,绝对没有理由你会这样做。

请注意,只是一个例子 ..说你的场景中有一些“猫”的东西。 非常简单 - 没有比这更复杂的了 - 你可以将它们全部放在同一个“文件夹” 中。 (也就是说,所有人都持有相同的游戏对象。)这只是一种非常简单的方法,可以完全避免你遇到的那种问题。

再次字面上无法找到“所有具有相同名称的游戏对象” - Find调用是一个本来不应该在Unity中的黑客攻击;他们明确没有

最重要的是不要忘记......如果不活动,查找不起作用!

Find调用是一个不应该出现在Unity中的黑客攻击:永远记住它甚至不能在非活动对象上工作。因为他们投入了一个“寻找名字”的概念,它可能是最好的,它不适用于非活动对象:但整个事情是一团糟 - 只是不要使用“发现”,永远。

特别是作为初学者 只需在检查器中拖动 - 老实说这很容易。 (而且,在几乎所有情况下,你的东西都会开始不活动,所以当然你必须这样做,因为你不能“找到”不活跃的东西。)

(并注意 - 请注意,如果您只是找到“老板”类型的脚本,请说出您的ScoresSoundEffects,请不要使用find。只需执行{{3} }。)