【发布时间】:2017-06-15 05:10:40
【问题描述】:
示例
在 Unity5 中,假设名为“SomeObject”的 GameObject 作为预制件存储在 Assets/Resources/SomeObject.prefab,我知道我可以按如下方式创建预制件的实例:
GameObject prefab = Resources.Load<GameObject>("SomeObject");
GameObject instance = GameObject.Instantiate(prefab);
一旦执行,instance GameObject 将是原始“SomeObject”预制件的副本,并将被放置在名为“SomeObject(Clone)”的当前活动场景中。
据我了解,GameObject prefab 代表实际的预制资产,对其所做的任何更改(设置名称、添加组件等)都会写入原始预制资产,这些更改即使在退出编辑器后仍然存在播放模式。
问题
-
由于所有游戏对象通常都存储在一个场景中,并且上面示例中
GameObject prefab上的scene属性似乎是未加载/无效/未命名,我应该将这个特殊的游戏对象确切地考虑在哪里?我似乎可以用它做所有我可以用普通游戏对象做的事情,但在层次/场景视图中不可见。它是有效地处于某种不确定状态,还是特殊的 PseudoScene?它似乎在
LoadSceneMode.Single场景更改中持续存在,但不像特殊的DontDestroyOnLoad场景,当对象被传递到GameObject.DontDestroyOnLoad(...)时会被移动到。 -
在上述示例中,
prefab和instance之间是否还有其他值得注意的区别,除了生命周期变化、无效场景和彼此不同的对象(具有不同的GetInstanceID()等)? -
由于在
prefab上调用GameObject.Instantiate(...)会产生一个在有效场景中的游戏对象,有没有办法手动创建处于类似“无场景”状态的游戏对象?我知道 Unity 打算让所有游戏对象都出现在场景中,所以这纯粹是一个学术问题。
我曾尝试查看functions involved 的documentation,但没有人深入了解当您在预制资源上调用Resources.Load 时具体发生的事情的技术细节。
【问题讨论】:
-
正如你可能告诉我的那样,我一次有效地推了 3 个问题,我现在缺乏直觉,无法真正知道我不知道的是什么,如果这样的话感觉。再试一次:由于 Resources.Load 产生的 GameObject 处于无法手动创建的状态,我很好奇这些差异的确切性质,并希望对幕后发生的事情有更多了解的人可以提供见解进入这里使用的系统,这可能不会从普通文档中立即显现出来。对于无法更清楚地表达这一点,我深表歉意。
标签: c# unity3d unity3d-editor unity3d-5