You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity中如何将烘焙光照图保存至预制件内?

针对Unity 2023.2.11f1的光照图预制件解决方案

问题1:将烘焙光照图嵌入预制件的标准工作流程

  1. 配置预制件实例的静态属性
    • 将预制件拖入场景,选中所有需要烘焙光照的子物体,在Inspector面板勾选Static > Lightmap Static。
    • 选中根预制件,在Inspector底部的Lightmapping Settings中,取消勾选Auto Generate Lightmap Index,手动设置固定的Lightmap Index和Lightmap Scale Offset(避免烘焙后被场景自动分配的参数覆盖)。
  2. 烘焙光照图
    • 打开Window > Rendering > Lighting面板,切换到Scene标签页。
    • 设置烘焙模式为Baked Global Illumination,指定光照图输出路径为项目内资源文件夹(如Assets/Lightmaps),点击Generate Lighting完成烘焙。
  3. 将光照数据同步到预制件资产
    • 选中场景中的预制件实例,点击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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 15:43:38