Unity 全局光照LightMap 动态加载

来源:互联网 发布:每天算工资软件 编辑:程序博客网 时间:2024/05/16 18:10

Unity5 里面, 当场景里的物体保存成Prefab之后,LightMap的信息就会丢失。Fuck。。

所以最后就写了个脚本,把每个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的贴图也丢了。

如有疑问,请回复哦~~



0 0