Unity如何实现附有LightingMap光照贴图的动态资源加载

您所在的位置:网站首页 unity怎么烘培整个场景 Unity如何实现附有LightingMap光照贴图的动态资源加载

Unity如何实现附有LightingMap光照贴图的动态资源加载

2023-07-22 11:14| 来源: 网络整理| 查看: 265

如题,项目中遇到这样一个问题,我们的大厅场景有很多背景城市,例如北京、上海、广州、深圳等城市,其中北京、上海等这些城市是独立的背景资源,每一个资源都有其对应的光照贴图。

我们知道Unity中光照贴图是以scene为单位来设定的,制作一个光照贴图的流程大概是这样:

1.对需要使用光照贴图信息的资源勾选LightingMap Static标签

2.开启灯光

3.在菜单Window->Lighting->Setting里配置好所需参数并生成光照贴图

总结

由上可知每一个场景只能设置一份光照贴图信息(注意:光照贴图的张数不一定是唯一的,它由场景的复杂度决定)且具有光照贴图的资源必须是静态资源不能动态加载。

常规思路

如果按照常规的思路我们要把不同城市的背景资源分别保存成一个单独的场景,在这个单独的场景中勾选LightingMap Static标签并烘焙对应光照贴图。

项目实际

可是对于我们的项目,除了背景不同,我们场景里的UI、角色和其他很多东西都是相同的,根据城市的数量重复创建很多包含这些相同的通用资源的方式是不合适的,这一方面造成了资源冗余增大了包体,另一方面也会导致逻辑处理的复杂度相对增加,维护成本降低。那怎么处理才能既保持通用资源只存在于一个场景又能让这些具有不同光照贴图的城市背景动态加载出来呢?

解决方案

最终我们采用了附加场景的解决方案,每一个城市单独存一个场景,这个场景中只有城市相关的资源,我们对这些场景分别做光照贴图,然后进入大厅的时候通过如下图所示的方式附加进对应城市场景并同时设置城市场景为主场景(只有主场景的光照贴图才可生效)

Plan B

除了上述我们使用的方案,还有一种方式可以实现项目的需求,但这种方式要求较高且性能开销相对较大,因此未采用,也分享给大家,这种方式需要自己保存mesh的光照信息,并运行时调用API做静态合批,步骤如下

1.通过PrefabLightmapData脚本记录光照贴图信息,参考链接:https://forum.unity3d.com/threads/problems-with-instantiating-baked-prefabs.324514/#post-2229465

2.运行时静态批处理,代码如下

注意:经过我之前不严谨的测试,这种方式貌似对PrefabLightmapData和静态批处理脚本的调用时机要求很高,必须在进入大厅场景的Awake函数中调用才能生效,所以大家如果采用这种方式的话一定要充分自测一下,如果跟我说的不符也请留言指正。

坑点

不论你采用PlanA还是PlanB,还有一个坑点需要注意,那就是如果你们的资源是assetbundle的话,一定要注意设置一下Graphic Setting里的LightingMap Modes,如下图所示,否则ab包里的shader会被Unity自动将LightingMap On的标签给剥离掉,默认的automatic下Unity会对打成ab包的shader做未使用标签的剥离优化



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3