Unity3D 4.x 版本获取烘焙信息 LightmappingManager

一、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
            }
        }


    }
}

猜你喜欢

转载自blog.csdn.net/yuyingwin/article/details/80256667