例子
在 Unity5 中,假设名为“SomeObject”的 GameObject 作为预制件存储在 Assets/Resources/SomeObject.prefab
中,我知道我可以按如下方式创建预制件的实例:
GameObject prefab = Resources.Load<GameObject>("SomeObject");
GameObject instance = GameObject.Instantiate(prefab);
执行后,instance
游戏对象将是原始“SomeObject”预制件的副本,并将被放置在名为“SomeObject(Clone)”的当前事件场景中。据我所知,
GameObject prefab
代表实际的预制 Assets ,对它所做的任何更改(设置名称、添加组件等)都会写入原始预制 Assets ,即使退出编辑器播放模式后,这些更改仍然存在。问题
scene
上的 GameObject prefab
属性似乎是 Unloaded/Invalid/Unnamed,我到底应该在哪里考虑这个特殊的 GameObject?我似乎可以用它做我可以用普通游戏对象做的一切,而不是在层次结构/场景 View 中可见。它是有效地处于某种不确定状态,还是特殊的 PseudoScene?它似乎通过
LoadSceneMode.Single
场景更改持续存在,但与传递到 DontDestroyOnLoad
时将对象移动到的特殊 GameObject.DontDestroyOnLoad(...)
场景不同。prefab
和 instance
之间是否还有其他值得注意的区别,除了生命周期变化、无效场景和彼此不同的对象(有不同的 GetInstanceID()
等)?GameObject.Instantiate(...)
上调用 prefab
会产生一个处于有效场景中的游戏对象,有没有办法手动创建处于类似“无场景”状态的游戏对象?我知道 Unity 打算让所有游戏对象都在场景中,所以这纯粹是一个学术问题。我曾尝试查看 documentation functions 的 involved ,但没有涉及在预制资源上调用
Resources.Load
时具体发生的技术细节。 最佳答案
它位于单独的文件中,未在场景中引用。一旦调用了Resources.Load<GameObject>("SomeObject");
,就会加载到内存中等待调用GameObject.Instantiate
时使用。
如果它被声明为 public GameObject prefab;
并从编辑器分配而不是 GameObject prefab Resources.Load<GameObject>("SomeObject");
,它将在场景加载时自动加载到内存中。
是的。
不能使用 Destroy
或 DestroyObject
函数破坏预制件。必须使用 DestroyImmediate
函数通过将 true
传递给它的第二个参数来销毁它:DestroyImmediate(prefab, true);
不,无法手动创建处于类似“无场景”状态的游戏对象。
虽然你可以伪造它。
最接近的方法是通过修改 GameObjects 的 hideFlags
变量使 GameObject 在 Editor 的 Hierarchy 和 Inspector 选项卡中不可见,然后停用该 GameObject。
GameObject obj = new GameObject("SomeObject");
obj.hideFlags = HideFlags.HideInHierarchy | HideFlags.HideInInspector;
之后,停用游戏对象:
obj.SetActive(false);
现在,游戏对象在编辑器中不可见,在场景和游戏 View 中也不可见。
预制件和典型的游戏对象之间真的没有太大区别。 Prefab 只是一个容纳 GameObject 的容器,以便它可以在场景之间重复使用和共享。修改一个预制件将更新它的任何实例。
想象一下,当您在场景中有数百个相同类型的游戏对象并且需要修改所有这些时。使用预制件,您只需要修改其中一个或仅修改预制件,然后单击“应用”即可更新其他实例。这是你唯一应该想到的预制件。
关于c# - 非实例化加载的预制件与实例化的预制件相比如何?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44559004/