应一些读者和用户的要求,小姐姐特此撰写本文,并通过实例演示Unity3d预制体(Prefab)的最新烘焙方法,以帮助很多人解决预制体烘焙之后,在运行时光影图丢失的问题。
为了简化问题,小姐姐导入一个模型,构造下图所示的简单场景。
下面创建一盏点光源(pointlight),灯光颜色设为橙色、模式为baked,其他参数如下图所示。
接下来按Ctrl+D,复制刚创建的那盏点光源,然后移动至另一边,将灯光颜色修改为粉色,其他参数如下图所示。
关闭系统默认创建的平行光(Directional Light),然后创建一盏聚光灯(Spotlight),参数如下图所示,如果两盏点光源太暗,可适当调整灯光强度和位置。
接下来创建一个空物体,并命名为“lights”,将刚才创建的三盏灯拖到其下打组,如下图所示。
这里小姐姐需要说明一下,Unity通过创建空物体来对物体的打组(或称编组),其图标与普通物体的图标相同,如下图中的“Lights”编组,因为空物体本身就是物体,其他物体拖入其下构成的编组,其图标与普通物体图标相同就不难理解了,这种编组中的物体不仅可以删除、还可以重排序,也可以移出该编组,而且可以向该编组中添加物体或其他编组。但同为编组,建模软件中的打组(为了不造成混乱,暂且称其为建模软件中的打组),导入Unity后,其图标与Unity的编组却大不相同,如下图中的“xiangzi”打组,这种图标代表该打组来自模型构建软件,这种编组中的物体不能单独删除(除非删除整个编组),不能重排序(除非在建模软件中操作后重新导入),但可以向该编组中添加物体或编组,所不同的是,在该编组中添加的物体或编组,其图标会带一个“+”图标,以示这些物体或编组不是该编组的原始物体,如下第二张图所示。
下面我们选中“xiangzi”编组,如下图所示勾选inspector面板右上角的“Static”,将其设为静态,然后点击弹出对话框中的“yes,change children(是的,同时改变其下的所有物体)”。
接下来展开Static后面向下的箭头,在其下拉菜单中取消“batching Static(批量静态化)选项的勾选,然后点击弹出对话框中的“是的,改变其下的所有物体”按钮。
再创建一个空物体,将其命名为“baibaoxiang”,然后将前面的“xiangzi”和“Lights”编组选中拖入其下,构成新的编组,形成编组的嵌套,如下图所示。
选中“baibaoxiang”编组,然后将“PrefabLMData.cs”脚本拖至该编组的Inspector面板中,这个脚本就与该编组关联起来了。
在assets下或其下的某个文件夹中创建一个文件夹,命名为“Prefabs”,用于存储预制体(Prefab),如下图所示。
打开刚创建的“Prefabs”文件夹,选中“baibaoxiang”群组,将其拖至"Prefabs"文件夹中,此时“Prefabs”文件夹中就会生成一个预制体“baibaoxiang”,同时层级面板中的“baibaoxiang”群组的图标变成了蓝色,并且这个群组变成了预制体的子,预制体成了这个群组的父,虽然预制体由这个群组生成,但这个群组与预制体的辈分发生了对调。另外,当这个群组生成预制体后,就不能再称其为群组了,而应称其为预制体的实例(也就是预制体的子),如下图所示。
下面我们就来烘焙预制体,首先按下图所示的光照参数进行设置。
接下来选中层级面板中预制体的实例“baibaoxiang”,然后点击Unity “Assets”菜单下的“Bake Prefab Lightmaps(烘焙预制体光照贴图)”命令,对预制体的实例进行烘焙,对预制体实例的烘焙会反馈到预制体中,因此对预制体实例的烘焙也称为预制体的烘焙。
在预制体烘焙时,如果不注意,有的人会以为没有反应,因为预制体烘焙进度不像unity场景的烘焙一样会出现在右下角的状态栏上,而是显示在任务栏的Unity图标上,如下图所示。
预制体烘焙制后的结果如下图所示。
预制体的实例由预制体生成,所以我们现在删除层级面板中预制体的实例,然后将预制体拖至层级面板或场景视图,如下图所示,但我们发现,场景中的预制体实例没有光影图。
场景中的预制体实例没有光影图,问题出在哪儿呢?我们应该明白,预制体是在实时运行时加载的,所以应该在播放状态下来测试预制体,而不是直接将预制体拖至场景中。现在按下播放按钮,然后将预制体拖向场景视图,此时我们发现,预制体实例的光影图被正确载入,如下图所示。
预制体可以在运行时在同一场景中加载或重复加载,也可以在不同场景中加载,下面我们来测试在不同场景中的加载。新建一场景,然后将刚才的预制体拖入(今天太晚了,改天再续...)