Unity 场景存在多个烘焙光照效果

    xiaoxiao2021-04-17  46

    using UnityEngine; using System.Collections.Generic; using System; [Serializable] public class ObjLightMapData { public string path; public Vector4 scaleOffset; } [Serializable] public class SceneLightMapData : MonoBehaviour { public GameObject targetObj; public Texture2D lightMap; //[SerializeField] public List<ObjLightMapData> objDataList = new List<ObjLightMapData>(); private const string CUSTOM_LIGHTMAP_PATH = "xxxx/LightMapDiffuse"; public void Clear() { if (objDataList.Count > 0) { objDataList.Clear(); } } string GetPath(Transform tran, string rootName) { if (tran.name != rootName) { string context = ""; context += tran.name; Transform par = tran.parent; while (par != null && par.name != rootName) { context = string.Format("{0}/{1}", par.name, context); par = par.parent; } return context; } return ""; } public bool Save() { Clear(); if (targetObj != null) { string rootName = targetObj.name; Renderer[] rs = targetObj.GetComponentsInChildren<Renderer>(); foreach (Renderer r in rs) { Transform t = r.transform; if (r != null && r.name != rootName) { ObjLightMapData data = new ObjLightMapData(); string path = GetPath(t, rootName); Vector4 scaleOffset = r.lightmapScaleOffset; data.path = path; data.scaleOffset = scaleOffset; objDataList.Add(data); } } return true; } return false; } public void Load(GameObject rootObj) { if (rootObj != null) { Vector4 notNormalVec4 = new Vector4(1, 1, 0, 0); for (int i = 0; i < objDataList.Count; i++) { ObjLightMapData data = objDataList[i]; string path = data.path; Vector4 scaleOffset = data.scaleOffset; Renderer r; Transform obj = rootObj.transform.Find(path); if (obj != null) { r = obj.GetComponent<Renderer>(); if (r == null || scaleOffset == notNormalVec4){ continue; } //r.realtimeLightmapScaleOffset = scaleOffset; // 换lightmap材质 Material mat = r.material; mat.shader = Shader.Find(CUSTOM_LIGHTMAP_PATH); mat.SetTexture("_LightMap", lightMap); mat.SetTextureScale("_LightMap", new Vector2(scaleOffset.x, scaleOffset.y)); mat.SetTextureOffset("_LightMap", new Vector2(scaleOffset.z, scaleOffset.w)); mat.SetColor("_Color", Color.white); } } } } }

    using UnityEngine; using System.Collections; using UnityEditor; [CustomEditor(typeof(SceneLightMapData))] public class SceneLightMapDataEditor : Editor { private SerializedProperty _targetObj; private SerializedProperty _lightmap; //private SerializedProperty _data; public void OnEnable() { _targetObj = serializedObject.FindProperty("targetObj"); _lightmap = serializedObject.FindProperty("lightMap"); //_data = serializedObject.FindProperty("_objDataList"); } public override void OnInspectorGUI() { EditorGUILayout.PropertyField(_targetObj); EditorGUILayout.PropertyField(_lightmap); //EditorGUILayout.PropertyField(_data); SceneLightMapData self = (SceneLightMapData)target; foreach (ObjLightMapData data in self.objDataList) { EditorGUILayout.Vector4Field(data.path, data.scaleOffset); } if (GUILayout.Button("Save")) { if (self.Save()) { EditorUtility.DisplayDialog("通知", "成功", "OK"); } else { EditorUtility.DisplayDialog("通知", "失败", "OK"); } } serializedObject.ApplyModifiedProperties(); } }

    using UnityEngine; using System.Collections; public class ConfigSceneLightmap : MonoBehaviour { public Object dataPrefab; // Use this for initialization void Start () { if (dataPrefab) { GameObject data = GameObject.Instantiate (dataPrefab) as GameObject; SceneLightMapData com = data.GetComponent<SceneLightMapData> (); Debug.Assert (com != null, "Prefab缺少SceneLightMapData组件"); com.Load (gameObject); } } // Update is called once per frame void Update () { } }

    转载请注明原文地址: https://ju.6miu.com/read-673287.html

    最新回复(0)