在层次结构中,我有一个父游戏对象(名为“父母”),它有一个孩子(名为“ 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);
是个好主意吗?
答案 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);
这也比使用“查找”功能更好,因为您只需要浏览调用行为的子对象。