using UnityEngine; using UnityEditor; using UnityEditor.SceneManagement; [CustomEditor(typeof(DirectionalLightSetter))] public class DirectionalLightEditor : Editor { private DirectionalLightSetter _target; private Light _light; private Quaternion _lastRotation; private Color _lastColor; private float _lastAtten; private Vector3 _lastSpecularEular; private void OnEnable() { _target = (DirectionalLightSetter)target; _light = _target.GetComponent(); if (_light == null) Debug.LogError("Directional Light Setter 上不存在光源组件!"); else { _target.SetLight(_light); _lastSpecularEular = _target.specularRotation.eulerAngles; CacheProperties(); } } private void CacheProperties() { _lastColor = _light.color; _lastAtten = _light.intensity; _lastRotation = _target.transform.rotation; } public override void OnInspectorGUI() { base.OnInspectorGUI(); if (_light != null) { if (_lastRotation != _target.transform.rotation || _lastColor != _light.color || _lastAtten != _light.intensity) { _target.SetLight(_light); CacheProperties(); } var eular = EditorGUILayout.Vector3Field("Specular Dir Eular", _lastSpecularEular); if (eular != _lastSpecularEular) { _target.specularRotation = Quaternion.Euler(eular); _lastSpecularEular = eular; _target.SetLight(_light); EditorUtility.SetDirty (_target); EditorSceneManager.MarkSceneDirty (EditorSceneManager.GetActiveScene()); } } if (GUILayout.Button("Reset Specular Dir")) { _target.specularRotation = _target.transform.rotation; _lastSpecularEular = _target.specularRotation.eulerAngles; _target.SetLight(_light); EditorUtility.SetDirty (_target); EditorSceneManager.MarkSceneDirty (EditorSceneManager.GetActiveScene()); } } }