例子
在 Unity5 中,假设一个名为“SomeObject”的游戏对象被存储为一个预制件Assets/Resources/SomeObject.prefab
,我知道我可以创建一个预制件的实例,如下所示:
GameObject prefab = Resources.Load<GameObject>("SomeObject");
GameObject instance = GameObject.Instantiate(prefab);
一旦执行,instance
GameObject 将是原始“SomeObject”预制件的副本,并将被放置在名为“SomeObject(Clone)”的当前活动场景中。
据我了解,GameObject prefab
代表实际的预制资产,对其所做的任何更改(设置名称、添加组件等)都会写入原始预制资产,即使在退出编辑器播放模式后这些更改仍然存在。
问题
由于所有游戏对象通常都存储在一个场景中,并且上面示例中的
scene
属性GameObject prefab
似乎是 Unloaded/Invalid/Unnamed,我究竟应该将这个特殊的 GameObject 放在哪里?我似乎可以用它做所有我可以用普通游戏对象做的事情,除了在层次/场景视图中可见。它是有效地处于某种不确定状态,还是特殊的 PseudoScene?它似乎通过
LoadSceneMode.Single
场景变化持续存在,但不像DontDestroyOnLoad
Objects 在传递到时移动到的特殊场景GameObject.DontDestroyOnLoad(...)
。除了生命周期变化、无效场景和彼此不同的对象(具有不同的对象等)之外,上述示例
prefab
之间是否还有其他值得注意的差异?instance
GetInstanceID()
由于调用
GameObject.Instantiate(...)
会prefab
产生一个处于有效场景中的游戏对象,有没有办法手动创建处于类似“无场景”状态的游戏对象?我知道 Unity 打算让所有游戏对象都出现在场景中,所以这纯粹是一个学术问题。