unity动态加载Lightmap
本文将详细介绍Unity动态加载Lightmap的方法,适合对该技术感兴趣或在这方面存在知识困惑的朋友阅读。
适用场景
若场景是动态生成的,就需要用到动态Lightmap方案;若场景是静态的,则无需了解这部分内容。
原理剖析
每个GameObject的Renderer信息中,会记录自身是否使用了Lightmap以及使用了Lightmap的哪部分,这两个参数分别是lightmapIndex和lightmapTilingOffset。其中,lightmapIndex表示使用了哪张索引的Lightmap,lightmapTilingOffset则记录使用的是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);
}
}
}
}
具体实现
了解原理后,实现动态加载Lightmap就相对容易了。可以使用JSON来保存所有场景的position、rotation、scale信息。若场景中有Lightmap,还需要保存lightmapIndex和lightmapTilingOffset信息。在实例化物体时,重新为这些参数赋值即可。
由于具体的整个流程较为复杂,这里就不详细展开说明了。
注意事项
- 冗余信息处理:可能会存在大量冗余的Lightmap信息,需要针对每个场景进行处理,避免对相同的Lightmap信息进行多次生成。
- 索引定义:在动态加载Lightmap时,需要自行定义好索引,或者寻找一种合适的方法对其进行分类。
- 场景静态化:动态加载完成后,需要调用
StaticBatchingUtility.Combine(parent)方法将整个场景静态化,以确保batching能正常使用。