Unity 全域性光照LightMap 動態載入
阿新 • • 發佈:2019-02-04
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的貼圖也丟了。
如有疑問,請回復哦~~