unity动态加载Lightmap的方法是这篇文章要说的。有兴趣或者都这方面知识还有困惑的朋友可以看一下。

若场景是动态生成的,则需要用到动态Lightmap方案。若是静态的话,不需要理解这部分。

首先需要知道的是,每个GameObject的Renderer信息都会有记录自己是否有用到lightmap和用到lightmap的哪部分的记录,这个记录是可以读取和修改的。这两个参数分别是lightmapIndex和lightmapTilingOffset,前者是用到了那张索引的lightmap,后者则是记录用的是lightmap的哪部分。

大家可以测试下这些信息,我写了个脚本直接输出。当然没有lightmap信息的物体会error警告。

以下脚本(BatchOperation.cs)放到Editor下便可以用了,选择想要查看的物体,点击菜单栏的Batch/测试Lightmapping信息便能直接输出结果。

  1. using UnityEditor;
  2. using UnityEngine;
  3. using System.Collections;
  4. public class BatchOperation : EditorWindow
  5. {
  6. [MenuItem("Batch/" + "测试Lightmapping信息 ")]
  7. static void TestLightmapingInfo()
  8. {
  9. GameObject[] tempObject;
  10. if (Selection.activeGameObject)
  11. {
  12. tempObject = Selection.gameObjects;
  13. for (int i = 0; i < tempObject.Length; i++)
  14. {
  15. Debug.Log("Object name: "  + tempObject[i].name);
  16. Debug.Log("Lightmaping Index: " + tempObject[i].renderer.lightmapIndex);
  17. Debug.Log("Lightmaping Offset: " + tempObject[i].renderer.lightmapTilingOffset);
  18. }
  19. }
  20. }
  21. }
知道原理后就好办了。
用JSON保存所有场景的position,rotation,scale信息,若有lightmap的话需要保存lightmapIndex和lightmapTilingOffset信息。实例化的时候重新赋值就好了。

具体整个流程太长了,我也不多说了。

需要注意的是:
1. 可能会有很多冗余的lightmap信息,这个需要每个场景去处理。相同的lightmap信息不要去多次生成。
2. 动态加载lightmap的时候的索引要自己定义好,或找个方法分类好。
3. 动态加载完之后需要调用一下StaticBatchingUtility.Combine(parent)来将整个场景静态化,使得batching能正常使用。