Unity中如何将烘焙光照图保存至预制件内?
针对Unity 2023.2.11f1的光照图预制件解决方案
问题1:将烘焙光照图嵌入预制件的标准工作流程
- 配置预制件实例的静态属性
- 将预制件拖入场景,选中所有需要烘焙光照的子物体,在Inspector面板勾选
Static > Lightmap Static。 - 选中根预制件,在Inspector底部的Lightmapping Settings中,取消勾选
Auto Generate Lightmap Index,手动设置固定的Lightmap Index和Lightmap Scale Offset(避免烘焙后被场景自动分配的参数覆盖)。
- 将预制件拖入场景,选中所有需要烘焙光照的子物体,在Inspector面板勾选
- 烘焙光照图
- 打开
Window > Rendering > Lighting面板,切换到Scene标签页。 - 设置烘焙模式为
Baked Global Illumination,指定光照图输出路径为项目内资源文件夹(如Assets/Lightmaps),点击Generate Lighting完成烘焙。
- 打开
- 将光照数据同步到预制件资产
- 选中场景中的预制件实例,点击Inspector顶部预制件工具栏中的Apply All,将烘焙后的光照图索引、缩放偏移等参数覆盖保存到预制件资产中。
- 确认Project面板中的烘焙光照图资源未被删除,且预制件的Renderer组件已正确引用该光照图。
问题2:无法嵌入光照图的替代解决方案
方案1:场景参考实例同步光照参数
由于预制件始终在同一场景实例化,可在场景中保留一个已烘焙好的预制件参考实例,运行时实例化后通过代码同步光照参数:
public GameObject bakedReferenceInstance; // 场景中已完成烘焙的预制件实例 public GameObject targetPrefab; // 待实例化的预制件资产 void SpawnWithBakedLighting() { GameObject newInstance = Instantiate(targetPrefab); Renderer[] targetRenderers = newInstance.GetComponentsInChildren<Renderer>(); Renderer[] refRenderers = bakedReferenceInstance.GetComponentsInChildren<Renderer>(); for (int i = 0; i < targetRenderers.Length; i++) { targetRenderers[i].lightmapIndex = refRenderers[i].lightmapIndex; targetRenderers[i].lightmapScaleOffset = refRenderers[i].lightmapScaleOffset; } }
方案2:将光照图合并到材质
把烘焙好的光照图导出为普通纹理,修改预制件的材质,将光照图作为Emission或Albedo层叠加,让预制件直接显示烘焙后的光照效果,无需依赖场景光照数据。注意调整材质混合模式(如Multiply)以匹配原烘焙效果。
方案3:子场景加载
将预制件放入单独的子场景,烘焙该子场景的光照图,运行时通过加载子场景的方式实例化预制件,光照数据会随子场景自动加载生效。
内容的提问来源于stack exchange,提问作者Bishok
相关产品推荐
相关产品推荐

