gpt4 book ai didi

c# - 非实例化加载预制件与实例化预制件相比如何?

转载 作者:行者123 更新时间:2023-11-30 15:57:50 25 4
gpt4 key购买 nike

例子

在 Unity5 中,假设名称为“SomeObject”的游戏对象作为预制件存储在 Assets/Resources/SomeObject.prefab 中,我知道我可以创建预制件的实例,如下所示:

GameObject prefab   = Resources.Load<GameObject>("SomeObject");
GameObject instance = GameObject.Instantiate(prefab);

执行后,instance GameObject 将成为原始“SomeObject”预制件的副本,并将以名称“SomeObject(Clone)”放置在当前事件场景中。


据我了解,GameObject prefab 代表实际的预制 Assets ,对其所做的任何更改(设置名称、添加组件等)都会写入原始预制 Assets ,并且这些即使退出编辑器播放模式,更改仍然存在。

问题

  1. 由于所有游戏对象通常都存储在一个场景中,而上例中 GameObject prefab 上的 scene 属性似乎是 Unloaded/Invalid/Unnamed,我到底应该在哪里考虑这个特殊的游戏对象?我似乎能够用它做我能用普通游戏对象做的所有事情,只是在层次结构/场景 View 中不可见。

    它实际上处于某种边缘状态,还是特殊的 PseudoScene?它似乎通过 LoadSceneMode.Single 场景变化持续存在,但不像特殊的 DontDestroyOnLoad 场景,对象在传递到 GameObject.DontDestroyOnLoad(.. .).

  2. 在上面的例子中,prefabinstance 之间是否还有其他值得注意的区别,除了生命周期变化、无效场景和彼此不同的对象(有不同的 GetInstanceID() 等)?

  3. 由于在 prefab 上调用 GameObject.Instantiate(...) 会产生 在有效场景中的游戏对象,因此有什么方法可以手动创建处于类似“无场景”状态的游戏对象?我知道 Unity 打算让所有游戏对象都出现在场景中,所以这纯粹是一个学术问题。

我试过查看 documentationfunctions involved ,但没有人深入了解当您在预制资源上调用 Resources.Load 时具体发生了什么的技术细节。

最佳答案

1.Where exactly should I consider this special GameObject to be?

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

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

2.Are there any other noteworthy differences between prefab and object?

是的。

预制件不能用 Destroy 销毁或 DestroyObject功能。它必须用 DestroyImmediate 销毁通过传递函数 true其第二个论点:DestroyImmediate(prefab, true);

3.Is there any way to manually create GameObjects that are in a similar 'no scene' state?

不,没有办法手动创建处于类似“无场景”状态的游戏对象。

尽管您可以伪造它。

最接近的是通过修改游戏对象的 hideFlags 使游戏对象在编辑器的层次结构检查器 选项卡中不可见。变量然后停用该游戏对象。

GameObject obj = new GameObject("SomeObject");
obj.hideFlags = HideFlags.HideInHierarchy | HideFlags.HideInInspector;

之后,停用游戏对象:

obj.SetActive(false);

现在,GameObject 在编辑器中是不可见的,在场景和游戏 View 中也是不可见的。


预制件和典型的游戏对象之间确实没有太大区别。 Prefab 只是一个容纳 GameObject 的容器,以便它可以在场景之间重复使用和共享。修改一个预制件将更新它的任何实例。

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

关于c# - 非实例化加载预制件与实例化预制件相比如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44559004/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com