/* ******************************************************************************** *Copyright(C),coolae.net *Author: chenbin *Version: 2.0 *Date: 2017-01-09 *Description: prefab lightmap data save & load. for unity 5.x version *Others: *History: ********************************************************************************* */ using UnityEngine; using System.Collections; using System.Collections.Generic; using UnityEngine.Rendering; /// /// CL prefab lightmap data. for unity 5.x version /// namespace Coolape { public class CLPrefabLightmapData : MonoBehaviour { [System.Serializable] public struct RendererInfo { public Renderer renderer; public int lightmapIndex; public Vector4 lightmapOffsetScale; } [SerializeField] public LightmapsMode lightmapsMode; [SerializeField] public LightProbes lightProbes; [SerializeField] public List m_RendererInfo = new List (); [SerializeField] public Texture2D[] m_Lightmaps; void Awake () { LoadLightmap (); } #if UNITY_EDITOR public void SaveLightmap () { m_RendererInfo.Clear (); lightmapsMode = LightmapSettings.lightmapsMode; lightProbes = LightmapSettings.lightProbes; var renderers = GetComponentsInChildren (); Texture2D lightmapTexture; LightmapData lightMapData; m_Lightmaps = new Texture2D[LightmapSettings.lightmaps.Length]; foreach (MeshRenderer r in renderers) { if (r.lightmapIndex != -1) { RendererInfo info = new RendererInfo (); info.renderer = r; info.lightmapOffsetScale = r.lightmapScaleOffset; info.lightmapIndex = r.lightmapIndex; //===================================== // Debug.Log (r.lightmapIndex); lightMapData = LightmapSettings.lightmaps [r.lightmapIndex]; #if UNITY_5_6_OR_NEWER lightmapTexture = lightMapData.lightmapColor; #else lightmapTexture = lightMapData.lightmapLight; #endif // info.lightmapIndex = m_Lightmaps.IndexOf (lightmapTexture); if (m_Lightmaps [r.lightmapIndex] == null) { info.lightmapIndex = r.lightmapIndex; // m_Lightmaps.Add (lightmapTexture); m_Lightmaps [r.lightmapIndex] = lightmapTexture; } //===================================== m_RendererInfo.Add (info); } } } #endif public void LoadLightmap () { if (m_RendererInfo == null || m_RendererInfo.Count <= 0) return; var lightmaps = LightmapSettings.lightmaps; int preIndex = lightmaps.Length; var combinedLightmaps = new LightmapData[preIndex + m_Lightmaps.Length]; lightmaps.CopyTo (combinedLightmaps, 0); LightmapData lightMapData; for (int i = 0; i < m_Lightmaps.Length; i++) { lightMapData = new LightmapData (); #if UNITY_5_6_OR_NEWER lightMapData.lightmapColor = m_Lightmaps [i]; #else lightMapData.lightmapLight = m_Lightmaps [i]; #endif lightMapData.lightmapDir = m_Lightmaps [i]; combinedLightmaps [preIndex + i] = lightMapData; } LightmapSettings.lightmapsMode = lightmapsMode; LightmapSettings.lightmaps = combinedLightmaps; foreach (var item in m_RendererInfo) { item.renderer.lightmapIndex = preIndex + item.lightmapIndex; item.renderer.lightmapScaleOffset = item.lightmapOffsetScale; } } } }