在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通常都存储在一个场景中,而上例中scene
上的GameObject prefab
属性似乎是Unloaded / Invalid / Unnamed,我应该在哪里考虑这个特殊的GameObject是?我似乎能够用普通的GameObjects做一切,而不是在层次/场景视图中可见。
它是否有效处于某种状态,或者是一种特殊的PseudoScene?它似乎会在LoadSceneMode.Single
场景更改后持续存在,但与传入DontDestroyOnLoad
时对象移动到的特殊GameObject.DontDestroyOnLoad(...)
场景不同。
上述示例中prefab
和instance
之间是否存在其他值得注意的差异,除了生命周期更改,无效场景和彼此不同的对象(具有不同的{{1}等等)?
由于在GetInstanceID()
上调用GameObject.Instantiate(...)
会产生一个有效场景中 的GameObject,有没有办法手动创建类似'的游戏对象'没有场景'状态?我知道Unity打算让所有GameObjects都在场景中,所以这纯粹是一个学术问题。
我已尝试查看documentation functions的involved,但在预制件上调用prefab
时,没有人详细了解具体情况。资源。
答案 0 :(得分:3)
1.我应该在哪里考虑这个特殊的GameObject?
它位于单独的文件中,未在场景中引用。调用Resources.Load<GameObject>("SomeObject");
后,会在调用GameObject.Instantiate
时将其加载到等待使用的内存中。
如果它被声明为public GameObject prefab;
并从编辑器而不是GameObject prefab Resources.Load<GameObject>("SomeObject");
分配,它将在场景加载时自动加载到内存中。
2.预制件和物体之间还有其他值得注意的差异吗?
是
使用Destroy
或DestroyObject
功能无法销毁预制件。必须通过DestroyImmediate
将true
传递给第二个论点来销毁它:DestroyImmediate(prefab, true);
3.有没有办法手动创建类似“无场景”的游戏对象。状态?
不,没有办法手动创建类似“无场景”的游戏对象。州。
虽然你可以假装它。
最接近的是通过修改GameObjects {{3}使GameObject在编辑器的 Hierarchy 和 Inspector 标签中不可见然后取消激活那个GameObject。
GameObject obj = new GameObject("SomeObject");
obj.hideFlags = HideFlags.HideInHierarchy | HideFlags.HideInInspector;
之后,停用GameObject:
obj.SetActive(false);
现在,GameObject在编辑器中是不可见的,在场景和游戏视图中也是不可见的。
预制件与典型的GameObject之间没有太大区别。 Prefab只是一个容纳GameObject的容器,因此可以在场景之间重复使用和共享。修改一个预制件将更新它的任何实例。
想象一下,当你在场景中有数百个相同类型的游戏对象并需要修改它们时。使用预制件,您只需要修改其中一个或仅预制预制件,然后单击应用以更新其他实例。这是你应该想到的预制件。