如何使用FindGameObjectWithTag到达游戏对象的子代

时间:2019-02-25 12:51:32

标签: c# unity3d

在层次结构中,我有一个父游戏对象(名为“父母”),它有一个孩子(名为“ child”并标记为“ John”)。最初,父级处于活动状态,而子级处于非活动状态。

父级具有一个脚本组件,我在其中具有Update()函数:

import admin from 'firebase-admin';
admin.initializeApp();
// ...

await admin.firestore().collection('test-date').add({
    schedule: [
        {

            startDate: Timestamp.fromDate(new Date()),
            endDate: Timestamp.fromDate(new Date()),
        },
        {
            startDate: Timestamp.fromDate(new Date()),
            endDate: Timestamp.fromDate(new Date()),
        },
    ]
});

它不起作用,并且我在控制台中收到“ NullReferenceException:对象引用未设置为对象的实例”。即使该孩子最初是被激活的,但我想停用它,它仍然无法正常工作,并且会出现相同的错误。为什么?首先在Update()中使用GameObject go = GameObject.FindGameObjectWithTag("John"); go.SetActive(true); 是个好主意吗?

2 个答案:

答案 0 :(得分:1)

不幸的是,在Unity中,您无法使用任何Find函数获得不活动的GameObject。 如果您不是要创建动态运行的GameObject,请使用公共变量并通过检查器对其进行分配,这是更好的性能选择(因为Unity可能使用引用),并且更容易(假设您更改标签,则不需要检入您对该标记的所有代码引用)

答案 1 :(得分:1)

正如Jichael指出的那样,您不能使用“查找”功能来获取不活动的游戏对象。 但是,您可以使用:

var yourComponent = GetComponentInChildren<YourComponentType>(true);

如果您的子对象具有任何附加组件,则可以很容易地获得它。请注意true(布尔值)参数。用来表示您要检查无效的游戏对象。

更详细的示例:

var spriteRenderer = GetComponentInChildren<SpriteRenderer>(true);
spriteRenderer.Sprite = yourSpriteVariable;
spriteRenderer.gameObject.SetActive(true);

这也比使用“查找”功能更好,因为您只需要浏览调用行为的子对象。