【问题标题】:Activating Inactive Same-Name Different-Tag Game Objects激活非活动的同名不同标签游戏对象
【发布时间】:2016-02-22 22:33:47
【问题描述】:

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

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

我想到了,既然无法更改名称,也许我可以给另一个一个不同的标签并根据所选场景激活正确的标签.

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

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

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

谁能帮我理解我做错了什么以及如何实现这一点:找到一个不活动的对象从两个同名但不同的非活动对象中标签:一个untagged,另一个标记为John)

【问题讨论】:

  • NOTE - 您的代码中的一行非常令人困惑,因为它指的是“this”游戏对象。我编辑了它以避免混淆。

标签: unity3d


【解决方案1】:

再简单不过了,只需将它们分配给不同的变量

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);
  ...
  }

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

(如果有人阅读还不知道如何在检查器中拖动连接,请检查任何基本的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 中不应该出现的 hack;他们明确没有


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

Find 调用是一个在 Unity 中不应该出现的 hack:永远记住 它甚至对非活动对象不起作用。既然他们提出了“查找名称”的概念,最好的情况是它不适用于非活动对象:但整个事情都是一团糟——永远不要使用“查找”。

特别是作为初学者只需拖入检查器 - 老实说就是这么简单。 (同样,在几乎所有情况下,你的东西都会开始不活动,所以你当然必须这样做,因为你无法“找到”不活动的东西。)

(请注意——不要忘记,如果您只是在寻找“boss”类型的脚本,请说您的 ScoresSoundEffects,切勿使用 find。只需使用 this easy idiom。)

【讨论】:

  • 谢谢乔。我尝试了第一部分,但都没有找到。可能是因为它们最初都是不活动的吗?
  • 当然不能使用publicGameObject johnCharacterOnLeft;的方式,因为它们的名字是一样的,只是标签不同。
  • 嗨@Jtech。我绝对可以向您保证,您使用public GameObject johnCharacterOnLeft 将我的代码复制到您的脚本中。 不要忘记在检查器中拖动连接。现在可以了吗?
  • 嗨@Jtech。我附上了一张图片,展示了你如何“拖到检查员那里”。为你工作?
  • 请记住:您无法通过标签找到不活动的游戏对象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多