8. Prefab,把东西做成模具
先动手做一个 GlowBall
Section titled “先动手做一个 GlowBall”下面通篇会拿同一个「发光球」当例子,所以这一章一开始,先花两分钟把它做出来。这一步本身没什么新概念,纯粹是给后面的讨论准备一个对象。
- Hierarchy 空白处右键 →
3D Object→Sphere,新物体命名GlowBall,Position 随便放在房间里能看见的位置(比如0, 1.5, 0)。 - 选中
GlowBall,Inspector 底部Add Component→ 搜Light→ 加上 Light 组件。 - Light 组件里:
Type保持默认Point(点光源,向四周发光);Range改成5;Intensity改成2;Color调一个偏暖的橙黄。 - (可选)顺手给
Sphere的 Material 颜色也调成接近的暖色,让球本身看着像在发光,而不是一颗被照亮的白球。材质细节在第 9 章展开,这里先随手调。
现在场景里有一颗能照亮周围的小球。下面所有的讨论都围绕它展开。
没有 Prefab 是什么样
Section titled “没有 Prefab 是什么样”GlowBall 调好了:颜色不错,Range 5,Intensity 2,看着满意。
然后在房间另外三个角落各放一个,Ctrl+D 复制三份拖到位。四个球了。
第二天觉得 Range 5 太小,照不亮房间,要统一改成 8。于是逐个点四个球,改四次。
四个还行。再想象一下:赛博朋克走廊,两侧二十盏壁灯,要统一微调霓虹颜色。改二十次。改到第十五盏一个念头会冒出来:能不能改一次,所有同类灯一起变?
能。这就是 Prefab。
Prefab 大致可以理解为「生产模具」。配好一个物体,把它存成模具。以后从模具里压出新实例,配置完全一致。
操作两步:
- 在 Project 面板的
Assets下新建文件夹Prefabs。 - 把 Hierarchy 里配好的
GlowBall直接拖进Prefabs文件夹。
拖完会看到两个变化:Project 面板里多了一个蓝色的 GlowBall.prefab 文件;Hierarchy 里 GlowBall 的名字和图标变成了蓝色,它现在是一个 Prefab Instance(预制体实例),和磁盘上那个模具绑定了。
从模具压出实例
Section titled “从模具压出实例”把 Project 面板里的 GlowBall.prefab 拖进场景,每拖一次多一个配置好的球。拖三次,加上原来那个,四个球。
修改模具,全场同步
Section titled “修改模具,全场同步”双击 Project 面板里的 GlowBall.prefab,进入 Prefab 编辑模式(四周变暗,只剩这个球)。
把 Light 的 Range 从 5 改成 8,Ctrl+S 保存,点左上角箭头退出。
回到场景,四个球的灯光范围全都自动变成了 8。改一次,全部生效。
Override:允许个别实例不一样
Section titled “Override:允许个别实例不一样”二十盏灯都一样,但其中一盏想做成绿色。
选中场景里的 GlowBall_C,直接把 Light 颜色改成绿色。改完后这个字段旁边出现一条蓝色小标记,Inspector 右上角会多出 Overrides 下拉,这代表这个实例在这个参数上和模具不同了。
接下来:改模具的 Range,GlowBall_C 的 Range 跟着变(没被 Override);改模具的颜色,GlowBall_C 颜色不变(已被 Override)。
什么时候该做成 Prefab
Section titled “什么时候该做成 Prefab”判断法则很简单:发现自己要复制同一组配置两次以上,就该做成 Prefab。
门(模型 + 碰撞体 + 音效 + 脚本)、交互按钮、椅子、篝火、路灯、传送点,凡是有重复性质的物件,同一套配置要用第二遍时就做成 Prefab。等复制了很多份再改,得逐个实例改或逐个 Unpack。
Unpack:把实例和模具断开
Section titled “Unpack:把实例和模具断开”右键一个 Prefab 实例,选 Unpack Prefab,它的名字会从蓝色变回黑色。此后模具怎么改都不再影响它。
适合引入了别人的 Prefab 想拆开研究的时候。但在自己的项目里慎用,解包后就失去全局一键更新的能力。
项目目录结构
Section titled “项目目录结构”随着项目推进,文件会越来越多。从第一天就建好这个目录:
Assets/├─ Scenes/ 场景文件├─ Prefabs/ 预制体├─ Materials/ 材质├─ Audio/ 音频└─ Scripts/ 脚本不用追求精细,但分类要有。一周之后回头看,会感谢现在多花的两分钟。