unity动态加载Lightmap的方法是这篇文章要说的。有兴趣或者都这方面知识还有困惑的朋友可以看一下。
若场景是动态生成的,则需要用到动态Lightmap方案。若是静态的话,不需要理解这部分。
首先需要知道的是,每个GameObject的Renderer信息都会有记录自己是否有用到lightmap和用到lightmap的哪部分的记录,这个记录是可以读取和修改的。这两个参数分别是lightmapIndex和lightmapTilingOffset,前者是用到了那张索引的lightmap,后者则是记录用的是lightmap的哪部分。
大家可以测试下这些信息,我写了个脚本直接输出。当然没有lightmap信息的物体会error警告。
以下脚本(BatchOperation.cs)放到Editor下便可以用了,选择想要查看的物体,点击菜单栏的Batch/测试Lightmapping信息便能直接输出结果。
- using UnityEditor;
- using UnityEngine;
- using System.Collections;
- public class BatchOperation : EditorWindow
- {
- [MenuItem("Batch/" + "测试Lightmapping信息 ")]
- static void TestLightmapingInfo()
- {
- GameObject[] tempObject;
- if (Selection.activeGameObject)
- {
- tempObject = Selection.gameObjects;
- for (int i = 0; i < tempObject.Length; i++)
- {
- Debug.Log("Object name: " + tempObject[i].name);
- Debug.Log("Lightmaping Index: " + tempObject[i].renderer.lightmapIndex);
- Debug.Log("Lightmaping Offset: " + tempObject[i].renderer.lightmapTilingOffset);
- }
- }
- }
- }
用JSON保存所有场景的position,rotation,scale信息,若有lightmap的话需要保存lightmapIndex和lightmapTilingOffset信息。实例化的时候重新赋值就好了。
具体整个流程太长了,我也不多说了。
需要注意的是:1. 可能会有很多冗余的lightmap信息,这个需要每个场景去处理。相同的lightmap信息不要去多次生成。
2. 动态加载lightmap的时候的索引要自己定义好,或找个方法分类好。
3. 动态加载完之后需要调用一下StaticBatchingUtility.Combine(parent)来将整个场景静态化,使得batching能正常使用。