【总结】Unity:代码动态加载Prefab预设体

2020年01月31日 18:11 1 点赞 0 评论 更新于 2025-11-21 21:31

在进行功能开发时,我们常常将可复用的对象制作成 .prefab 预设物体,存放在 Resources 目录下,使用时再动态加载到场景中并实例化。例如子弹、特效甚至音频等,都可以制作成预设体。

预设动态加载到场景

一个预设体若要通过代码控制在场景中显示,通常需要三个步骤。下面以动态加载怪物血条为例,分析一个常见的误区。

1. 预设体资源加载

通过以下代码从资源目录加载 HP_Bar.prefab 预设体,并使用 GameObject 对象存放:

// 加载预设体资源
GameObject hp_bar = (GameObject)Resources.Load("Prefabs/HP_Bar");

此时,该预设物体并未真正载入到场景中,因为还未进行实例化操作。

2. 预设体实例化

在第一步中,预设体资源已加载完毕,但未实例化的资源不会出现在场景中。因此,第二步需要对资源进行实例化,可使用 MonoBehaviour.Instantiate 函数完成。其实质是从预设体资源中克隆出一个对象,该对象具有与预设体完全相同的属性,并被加载到当前场景中。

// 实例化预设体
Instantiate(hp_bar);

完成上述代码后,当前场景中会出现一个实例化后的对象,可在 Hierarchy 栏中查看。由于未对实例化后的对象进行任何属性设置,其属性与预设体最初的属性保持一致,并且其父节点默认为当前场景的最外层。

3. 实例化对象属性设置(可选)

完成上述步骤后,我们已能在场景中看到实例化后的对象。但通常情况下,为了使对象之间层次感分明,方便进行统一管理,避免在 Hierarchy 中看到一大堆并排散乱的对象,我们需要为对象设置名称、父节点等属性。

常见错误

对未初始化的 hp_bar 进行属性设置,设置后的属性在实例化之后无法生效。这是因为最后在场景中显示的并非实例化前的资源对象,而是一个克隆对象。所以,若希望设置的属性在最终显示的对象中生效,需要对实例化之后的对象进行设置。

正确设置代码

以下代码可将实例化对象成功挂载到父节点 Canvas 上:

GameObject hp_bar = (GameObject)Resources.Load("Prefabs/HP_Bar");
GameObject mUICanvas = GameObject.Find("Canvas");
hp_bar = Instantiate(hp_bar);
hp_bar.transform.parent = mUICanvas.transform;

实际上,前两个步骤可以合并完成,简化后的代码如下:

GameObject hp_bar = (GameObject)Instantiate(Resources.Load("Prefabs/HP_Bar"));
GameObject mUICanvas = GameObject.Find("Canvas");
hp_bar.transform.parent = mUICanvas.transform;