非实例化的加载预制件如何与实例化的预制件进行比较?

时间:2017-06-15 05:10:41

标签: c# unity3d unity3d-editor unity3d-5

实施例

在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表示实际的预制资产,对其进行的任何更改(设置名称,添加组件等)都会写入原始预制资产,这些更改即使在退出编辑播放模式。

问题

  1. 由于所有GameObject通常都存储在一个场景中,而上例中scene上的GameObject prefab属性似乎是Unloaded / Invalid / Unnamed,我应该在哪里考虑这个特殊的GameObject是?我似乎能够用普通的GameObjects做一切,而不是在层次/场景视图中可见。

    它是否有效处于某种状态,或者是一种特殊的PseudoScene?它似乎会在LoadSceneMode.Single场景更改后持续存在,但与传入DontDestroyOnLoad时对象移动到的特殊GameObject.DontDestroyOnLoad(...)场景不同。

  2. 上述示例中prefabinstance之间是否存在其他值得注意的差异,除了生命周期更改,无效场景和彼此不同的对象(具有不同的{{1}等等)?

  3. 由于在GetInstanceID()上调用GameObject.Instantiate(...)会产生一个有效场景中 的GameObject,有没有办法手动创建类似'的游戏对象'没有场景'状态?我知道Unity打算让所有GameObjects都在场景中,所以这纯粹是一个学术问题。

  4. 我已尝试查看documentation functionsinvolved,但在预制件上调用prefab时,没有人详细了解具体情况。资源。

1 个答案:

答案 0 :(得分:3)

  

1.我应该在哪里考虑这个特殊的GameObject?

它位于单独的文件中,未在场景中引用。调用Resources.Load<GameObject>("SomeObject");后,会在调用GameObject.Instantiate时将其加载到等待使用的内存中。

如果它被声明为public GameObject prefab;并从编辑器而不是GameObject prefab Resources.Load<GameObject>("SomeObject");分配,它将在场景加载时自动加载到内存中。

  

2.预制件和物体之间还有其他值得注意的差异吗?

使用DestroyDestroyObject功能无法销毁预制件。必须通过DestroyImmediatetrue传递给第二个论点来销毁它: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的容器,因此可以在场景之间重复使用和共享。修改一个预制件将更新它的任何实例。

想象一下,当你在场景中有数百个相同类型的游戏对象并需要修改它们时。使用预制件,您只需要修改其中一个或仅预制预制件,然后单击应用以更新其他实例。这是你应该想到的预制件。