using UnityEngine; using System.Collections; using System.Collections.Generic; using UnityEngine.Rendering; public class PrefabLightmapData : MonoBehaviour { [System.Serializable] public struct RendererInfo { public Renderer renderer; public int lightmapIndex; public Vector4 lightmapOffsetScale; } [System.Serializable] public struct LightmapInfo { public Texture2D lightmapFar; public Texture2D lightmapNear; } public List m_RendererInfo = new List(); public List lightmapInfo = new List(); void Awake() { ResetT4mShader(); LoadLightmap(); } private void ResetT4mShader() { Renderer[] tmpRenderers = gameObject.GetComponentsInChildren(); if (tmpRenderers == null) { return; } for (int i = 0, length = tmpRenderers.Length; i < length; i++) { //重新设置T4M Material[] tmpMaterialArray = tmpRenderers[i].materials; for (int j = 0, matlength = tmpMaterialArray.Length; j < matlength; j++) { if (tmpMaterialArray[j].shader.name.Contains("T4M 4 Textures")) { Shader tmpShader = Shader.Find("T4MShaders/ShaderModel2/Diffuse/T4M 4 Textures"); if (tmpShader == null) { DebugEx.Log("tmpShader is Null"); continue; } tmpMaterialArray[j].shader = tmpShader; } } } } public void SaveLightmap() { m_RendererInfo.Clear(); var renderers = GetComponentsInChildren(); 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); } } lightmapInfo.Clear(); LightmapData[] mapDatas = LightmapSettings.lightmaps; for (int i = 0; i < mapDatas.Length; i++) { LightmapInfo info = new LightmapInfo(); info.lightmapFar = mapDatas[i].lightmapColor; info.lightmapNear = mapDatas[i].lightmapDir; lightmapInfo.Add(info); } } public void LoadLightmap() { if (m_RendererInfo.Count <= 0) return; foreach (var item in m_RendererInfo) { item.renderer.lightmapIndex = item.lightmapIndex; item.renderer.lightmapScaleOffset = item.lightmapOffsetScale; } LightmapSettings.lightmaps = null; if (lightmapInfo.Count == 0) return; LightmapData[] datas = new LightmapData[lightmapInfo.Count]; for (int i = 0; i < lightmapInfo.Count; i++) { datas[i] = new LightmapData(); datas[i].lightmapColor = lightmapInfo[i].lightmapFar; datas[i].lightmapDir = lightmapInfo[i].lightmapNear; } LightmapSettings.lightmaps = datas; } }