出于某种原因,我无法更改游戏对象(化身)的名称,但我需要有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
)
答案 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);
...
}
请注意,作为一项规则,当您学习时, 不 使用“查找”。就这么简单。使用公共变量并拖动以在检查器中进行连接。
(如果有人在阅读时还不知道如何拖动连接,请检查任何基本的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 ...
}
了解这一点非常重要
生命的生命 - Find
是一种你永远不应该真正使用的黑客,除了在极少数情况下。如果你(出于某种原因?)需要“找到”具有特定名称的所有游戏对象,你必须简单地查看场景中的每一件事(这不是特别容易做到的)。你可以轻松谷歌这个。但是,绝对没有理由你会这样做。
请注意,只是一个例子 ..说你的场景中有一些“猫”的东西。 非常简单 - 没有比这更复杂的了 - 你可以将它们全部放在同一个“文件夹” 中。 (也就是说,所有人都持有相同的游戏对象。)这只是一种非常简单的方法,可以完全避免你遇到的那种问题。
再次字面上无法找到“所有具有相同名称的游戏对象” - Find
调用是一个本来不应该在Unity中的黑客攻击;他们明确没有
Find
调用是一个不应该出现在Unity中的黑客攻击:永远记住它甚至不能在非活动对象上工作。因为他们投入了一个“寻找名字”的概念,它可能是最好的,它不适用于非活动对象:但整个事情是一团糟 - 只是不要使用“发现”,永远。
特别是作为初学者 只需在检查器中拖动 - 老实说这很容易。 (而且,在几乎所有情况下,你的东西都会开始不活动,所以当然你必须这样做,因为你不能“找到”不活跃的东西。)
(并注意 - 请注意,如果您只是找到“老板”类型的脚本,请说出您的Scores
或SoundEffects
,请不要使用find。只需执行{{3} }。)