unity动态加载Lightmap

2015年01月24日 11:47 0 点赞 0 评论 更新于 2017-05-09 03:40

本文将详细介绍Unity动态加载Lightmap的方法,适合对该技术感兴趣或在这方面存在知识困惑的朋友阅读。

适用场景

若场景是动态生成的,就需要用到动态Lightmap方案;若场景是静态的,则无需了解这部分内容。

原理剖析

每个GameObject的Renderer信息中,会记录自身是否使用了Lightmap以及使用了Lightmap的哪部分,这两个参数分别是lightmapIndexlightmapTilingOffset。其中,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来保存所有场景的positionrotationscale信息。若场景中有Lightmap,还需要保存lightmapIndexlightmapTilingOffset信息。在实例化物体时,重新为这些参数赋值即可。

由于具体的整个流程较为复杂,这里就不详细展开说明了。

注意事项

  1. 冗余信息处理:可能会存在大量冗余的Lightmap信息,需要针对每个场景进行处理,避免对相同的Lightmap信息进行多次生成。
  2. 索引定义:在动态加载Lightmap时,需要自行定义好索引,或者寻找一种合适的方法对其进行分类。
  3. 场景静态化:动态加载完成后,需要调用StaticBatchingUtility.Combine(parent)方法将整个场景静态化,以确保batching能正常使用。

作者信息

feifeila

feifeila

共发布了 570 篇文章