Unity 全局光照LightMap 动态加载
2016-01-11 11:03
1771 查看
Unity5 里面, 当场景里的物体保存成Prefab之后,LightMap的信息就会丢失。Fuck。。
所以最后就写了个脚本,把每个Render里的lightmap纪录下来,当prefab实例化之后,重新设置。
上代码。。
相关设置:
注意事项:检查下是否勾选了 Static -> BatchingStatic ,如果勾选了,一定要去除勾选 !!!!!!
当场景中LightMap烘培好了之后,在perfab根节点上面挂上这个脚本,右键-》SaveData,之后apply prefab。
在运行时场景初始化完成之后。调用SetUp方法,即可挂载lightMap。
重点!!我遇上个问题,需要保持原来存在的渲染场景,assetbundle才的LightMap能正常。否则就不会有LightMap,希望谁来个提示。
如果把原来渲染lightmap的场景删了,那么在手机上就会加载不到。
我估摸着是因为assetbundle的时候,没有把lightmap的贴图打包进去,只保存了引用的关系。
所以如果场景删了,那么lightmap的贴图也丢了。
如有疑问,请回复哦~~
所以最后就写了个脚本,把每个Render里的lightmap纪录下来,当prefab实例化之后,重新设置。
上代码。。
相关设置:
注意事项:检查下是否勾选了 Static -> BatchingStatic ,如果勾选了,一定要去除勾选 !!!!!!
using UnityEngine; using System.Collections; using System.Collections.Generic; using UnityEngine.Rendering; public class PrefabLightmapData : MonoBehaviour { //LightMap信息 [System.Serializable] public struct RendererInfo { public Renderer renderer; public int lightmapIndex; public Vector4 lightmapOffsetScale; } //场景中的Fog信息 [System.Serializable] public struct FogInfo { public bool fog; public FogMode fogMode; public Color fogColor; public float fogStartDistance; public float fogEndDistance; public float fogDensity; } public FogInfo fogInfo; public List<RendererInfo> m_RendererInfo; public List<Texture2D> lightmapNear; public List<Texture2D> lightmapFar; public LightmapData[] lightmapData; public LightmapsMode lightmapsMode; //地形的LightMap信息 public Terrain terrain; public RendererInfo terrainRendererInfo; //设置光照信息 [ContextMenu("SetUp")] public void SetUp(){ lightmapData = new LightmapData[lightmapNear.Count > lightmapFar.Count ? lightmapNear.Count : lightmapFar.Count]; for(int i = 0; i < lightmapData.Length; i ++){ lightmapData[i]=new LightmapData(); lightmapData[i].lightmapFar = i < lightmapFar.Count ? lightmapFar[i] : null; lightmapData[i].lightmapNear = i < lightmapNear.Count ? lightmapNear[i] : null; } LightmapSettings.lightmapsMode = lightmapsMode; LightmapSettings.lightmaps=lightmapData; LoadLightmap(); RenderSettings.fog = fogInfo.fog; RenderSettings.fogMode = fogInfo.fogMode; RenderSettings.fogColor = fogInfo.fogColor; RenderSettings.fogStartDistance = fogInfo.fogStartDistance; RenderSettings.fogEndDistance = fogInfo.fogEndDistance; RenderSettings.fogDensity = fogInfo.fogDensity; } //保存光照信息 [ContextMenu("SaveData")] public void SaveData(){ SaveLightmap (); } public void SaveLightmap() { fogInfo = new FogInfo (); fogInfo.fog = RenderSettings.fog; fogInfo.fogMode = RenderSettings.fogMode; fogInfo.fogColor = RenderSettings.fogColor; fogInfo.fogStartDistance = RenderSettings.fogStartDistance; fogInfo.fogEndDistance = RenderSettings.fogEndDistance; lightmapNear = new List<Texture2D>(); lightmapFar = new List<Texture2D>(); for(int i = 0; i < LightmapSettings.lightmaps.Length; i ++){ LightmapData data = LightmapSettings.lightmaps[i]; if(data.lightmapNear != null){ lightmapNear.Add(data.lightmapNear); } if(data.lightmapFar != null){ lightmapFar.Add(data.lightmapFar); } } m_RendererInfo = new List<RendererInfo> (); var renderers = GetComponentsInChildren<MeshRenderer>(); foreach (MeshRenderer r in renderers) { if (r.lightmapIndex != -1) { RendererInfo info = new RendererInfo(); info.renderer = r; info.lightmapOffsetScale = r.lightmapScaleOffset; info.lightmapIndex = r.lightmapIndex; m_RendererInfo.Add(info); } } terrain = GetComponentInChildren<Terrain> (); if (terrain != null) { terrainRendererInfo = new RendererInfo(); terrainRendererInfo.lightmapOffsetScale = terrain.lightmapScaleOffset; terrainRendererInfo.lightmapIndex = terrain.lightmapIndex; } lightmapsMode = LightmapSettings.lightmapsMode; } public void LoadLightmap() { if (m_RendererInfo.Count <= 0) return; if (terrain != null) { terrain.lightmapScaleOffset = terrainRendererInfo.lightmapOffsetScale; terrain.lightmapIndex = terrainRendererInfo.lightmapIndex; } foreach (var item in m_RendererInfo) { item.renderer.lightmapIndex = item.lightmapIndex; item.renderer.lightmapScaleOffset = item.lightmapOffsetScale; } } }
当场景中LightMap烘培好了之后,在perfab根节点上面挂上这个脚本,右键-》SaveData,之后apply prefab。
在运行时场景初始化完成之后。调用SetUp方法,即可挂载lightMap。
重点!!我遇上个问题,需要保持原来存在的渲染场景,assetbundle才的LightMap能正常。否则就不会有LightMap,希望谁来个提示。
如果把原来渲染lightmap的场景删了,那么在手机上就会加载不到。
我估摸着是因为assetbundle的时候,没有把lightmap的贴图打包进去,只保存了引用的关系。
所以如果场景删了,那么lightmap的贴图也丢了。
如有疑问,请回复哦~~
相关文章推荐
- Shell 脚本编程陷阱
- VBS脚本写的Windows硬件检测工具分享
- 用vbscript实现隐藏任务栏图标的脚本
- 用autoit编写第一个脚本(Hello World)
- VBS调用WMI快速关闭IE的脚本
- Oracle数据库执行脚本常用命令小结
- 收集的ROS防火墙脚本
- JSP脚本漏洞面面观
- 不错的批处理脚本 第一部分
- VBS脚本加密/解密VBS脚本(简易免杀版1.1)
- 不错的批处理脚本实例代码 第二部分
- 使用脚本和批处理清除电脑中的痕迹的代码第1/2页
- 让你的脚本说话
- Lua脚本获取喜马拉雅MP3音频地址
- SQL Server中数据行批量插入脚本的存储实现
- 编程界主流脚本编程语言的比较和选择
- 批量文件查找替换功能的vbs脚本
- Powershell脚本的4种执行权限介绍
- Windows Powershell 执行文件和脚本