最新文章
泰课新年学课蛇来运转欢度春节活动
02-01 20:25
共庆2024圣诞、元旦泰课双蛋活动
12-16 10:21
泰课共庆75周年国庆活动!
10-05 21:24
暑假双月联动学习计划 7月15 - 8月21日
07-14 23:09
泰课在线劳动光荣,勤学快乐之五月勤学季活动
04-30 21:19
2024年青春绽放开学季活动
03-11 13:01
【总结】Unity:代码动态加载Prefab预设体
在进行功能开发时,我们常常将可复用的对象制作成 .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;