一、Editor 文件夹下
(1)LightmappingManagerEditor.cs
using UnityEngine;
using System.Collections;
using UnityEditor;
[CustomEditor(typeof(LightmappingManager))]
public class LightmappingManagerEditor : Editor
{
LightmappingManager lightmappingmanager;
// private SerializedProperty lightmapsTextures;
void OnEnable()
{lightmappingmanager = target as LightmappingManager;
}
public override void OnInspectorGUI()
{
this.DrawDefaultInspector();
if (GUILayout.Button("Apply lightMaps") && lightmappingmanager != null)
{
lightmappingmanager.SetLightMapData();
lightmappingmanager.SetLightMapTextures();
}
}
}
(2) LightMappingPortingManager.cs
using UnityEngine;
using System.Collections;
using UnityEditor;
using System.Linq;
using System;
using System.IO;
using UnityEditor.SceneManagement;
public class LightMappingPortingManager : EditorWindow
{
bool onlyActive = true;
private string unityVersion;
// Add menu named "My Window" to the Window menu
[MenuItem("Window/LightMapping Porting Manager")]
static void Init()
{
// Get existing open window or if none, make a new one:
LightMappingPortingManager window = (LightMappingPortingManager)EditorWindow.GetWindow(typeof(LightMappingPortingManager));
window.Show();
}
void OnGUI()
{
GUILayout.Label("LightMapping Porting Manager", EditorStyles.boldLabel);
unityVersion = UnityEditorInternal.InternalEditorUtility.GetFullUnityVersion();
//bool isversion4 = unityVersion.StartsWith("4.X");
//GUILayout.Label("Unity Version: " + unityVersion);
//EditorGUI.BeginDisabledGroup(!isversion4);
//GUILayout.Label("GET 4.x LIGHTING DATA");
if (GUILayout.Button("Asign LightMapData"))
{
AssignComponentToObjects(onlyActive);
}
onlyActive = EditorGUILayout.Toggle("Only Active Objects", onlyActive);
//EditorGUI.EndDisabledGroup();
//EditorGUI.BeginDisabledGroup(isversion4);
GUILayout.Label("SET LIGHTING DATA TO 5.x");
if (GUILayout.Button("Get LightMapData"))
{
GetLightMapsAndData();
}
EditorGUI.EndDisabledGroup();
GUILayout.Space(50);
if (GUILayout.Button("Delete LightMapData from renderers"))
{
DeleteComponentFromObjects();
}
}
void GetLightMapsAndData()
{
if (GameObject.FindObjectOfType<LightmappingManager>())
return;
LightMapDataContainerObject lightmapDataAsset = ScriptableObject.CreateInstance<LightMapDataContainerObject>();
LightMapData[] lighmapdata = Resources.FindObjectsOfTypeAll<LightMapData>() as LightMapData[];
Renderer[] rendererlist = new Renderer[lighmapdata.Length];
int[] indexes = new int[lighmapdata.Length];
Vector4[] lightmapOffsetScales = new Vector4[lighmapdata.Length];
for (int i = 0; i < lighmapdata.Length; i++)
{
rendererlist[i] = lighmapdata[i].m_RendererInfo.renderer;
indexes[i] = lighmapdata[i].m_RendererInfo.lightmapIndex;
lightmapOffsetScales[i] = lighmapdata[i].m_RendererInfo.lightmapOffsetScale;
}
lightmapDataAsset.lightmapIndexes = indexes;
lightmapDataAsset.lightmapOffsetScales = lightmapOffsetScales;
//AssetDatabase.CreateAsset(lightmapDataAsset,"Assets/LightMapData_"+Path.GetFileNameWithoutExtension(EditorApplication.currentScene));
AssetDatabase.CreateAsset(lightmapDataAsset, "Assets/LightMapData_" + Path.GetFileNameWithoutExtension(EditorSceneManager.GetActiveScene().ToString()));
AssetDatabase.SaveAssets();
GameObject lightmappingManager = EditorUtility.CreateGameObjectWithHideFlags("LightmappingManager", HideFlags.None, new Type[] { typeof(LightmappingManager) });
lightmappingManager.GetComponent<LightmappingManager>().sceneRenderers = rendererlist;
lightmappingManager.GetComponent<LightmappingManager>().lighmapDataContainer = lightmapDataAsset;
lightmappingManager.GetComponent<LightmappingManager>().SetLightMapData();
}
void DeleteComponentFromObjects()
{
Renderer[] rendererObjects = Resources.FindObjectsOfTypeAll<Renderer>().Where(c => c.gameObject.hideFlags == HideFlags.None).ToArray() as Renderer[];
foreach (Renderer g in rendererObjects)
{
if (g.gameObject.GetComponent<LightMapData>())
{
DestroyImmediate(g.gameObject.GetComponent<LightMapData>());
}
}
}
void AssignComponentToObjects(bool OnlyActive)
{
Renderer[] rendererObjects;
if (OnlyActive)
{
rendererObjects = GameObject.FindObjectsOfType<Renderer>() as Renderer[];
}
else
{
rendererObjects = Resources.FindObjectsOfTypeAll<Renderer>().Where(c => c.gameObject.hideFlags == HideFlags.None).ToArray() as Renderer[];
}
foreach (Renderer g in rendererObjects as Renderer[])
{
if (!g.gameObject.GetComponent<LightMapData>())
{
g.gameObject.AddComponent<LightMapData>().GetInfo();
}
}
}
}
二、Scripts 文件夹
(1)LightMapData.cs
using UnityEngine;
using System.Collections;
public class LightMapData : MonoBehaviour
{
[System.Serializable]
public struct RendererInfo
{
public Renderer renderer;
public int lightmapIndex;
public Vector4 lightmapOffsetScale;
}
[SerializeField]
public RendererInfo m_RendererInfo;
public void GetInfo()
{
m_RendererInfo.renderer = GetComponent<Renderer>();
if (m_RendererInfo.renderer)
{
m_RendererInfo.lightmapIndex = m_RendererInfo.renderer.lightmapIndex;
#if UNITY_2017
m_RendererInfo.lightmapOffsetScale = m_RendererInfo.renderer.lightmapScaleOffset;
#else
m_RendererInfo.lightmapOffsetScale = m_RendererInfo.renderer.lightmapScaleOffset;
#endif
}
}
}
(2) LightMapDataContainerObject.cs
using UnityEngine;
using System.Collections;
[System.Serializable]
public class LightMapDataContainerObject : ScriptableObject
{
public int[] lightmapIndexes;
public Vector4[] lightmapOffsetScales;
}
(3)LightmappingManager.cs
using UnityEngine;
using System.Collections;
[ExecuteInEditMode]
public class LightmappingManager : MonoBehaviour
{
[SerializeField]
public Renderer[] sceneRenderers;
public LightMapDataContainerObject lighmapDataContainer;
SerializeField]
public Texture2D[] lightMapTexturesFar;
void Awake()
{
}
private void Start()
{
SetLightMapData();
SetLightMapTextures();
}
public void SetLightMapTextures()
{
if (lightMapTexturesFar == null || lightMapTexturesFar.Length <= 0)
return;
LightmapData[] lightmapData = new LightmapData[lightMapTexturesFar.Length];
for (int i = 0; i < lightMapTexturesFar.Length; i++)
{
lightmapData[i] = new LightmapData();
#if UNITY_2017
lightmapData[i].lightmapColor = lightMapTexturesFar[i];
#elif UNITY_5
lightmapData[i].lightmapFar = lightMapTexturesFar[i];
#endif
}
#if UNITY_2017
LightmapSettings.lightmapsMode = LightmapsMode.NonDirectional;
#endif
LightmapSettings.lightmaps = lightmapData;
}
public void SetLightMapData()
{
if (sceneRenderers.Length <= 0)
return;
for (int i = 0; i < sceneRenderers.Length; i++)
{
if (sceneRenderers[i])
{
sceneRenderers[i].lightmapIndex = lighmapDataContainer.lightmapIndexes[i];
#if UNITY_2017
sceneRenderers[i].lightmapScaleOffset = lighmapDataContainer.lightmapOffsetScales[i];
#else
sceneRenderers[i].lightmapScaleOffset = lighmapDataContainer.lightmapOffsetScales[i];
#endif
}
}
}
}