using System.Collections.Generic; using UnityEditor; using UnityEditor.SceneManagement; using UnityEngine; using Test_2022.LightsControl; [CustomEditor(typeof(LightsControlController))] [CanEditMultipleObjects] public sealed class LightsControlControllerEditor : Editor { public override void OnInspectorGUI() { DrawDefaultInspector(); EditorGUILayout.Space(10); using (new EditorGUILayout.VerticalScope(EditorStyles.helpBox)) { EditorGUILayout.LabelField("Tools", EditorStyles.boldLabel); using (new EditorGUILayout.HorizontalScope()) { if (GUILayout.Button("Add Selected")) AddSelectedLights(false); if (GUILayout.Button("Add Selected (+Children)")) AddSelectedLights(true); } using (new EditorGUILayout.HorizontalScope()) { if (GUILayout.Button("Find All (Clear)")) FindAll(true); if (GUILayout.Button("Find All (Append)")) FindAll(false); } using (new EditorGUILayout.HorizontalScope()) { if (GUILayout.Button("Remove Nulls")) RemoveNulls(); if (GUILayout.Button("Clear List")) ClearList(); } } EditorGUILayout.Space(10); using (new EditorGUILayout.VerticalScope(EditorStyles.helpBox)) { EditorGUILayout.LabelField("Runtime", EditorStyles.boldLabel); if (!Application.isPlaying) EditorGUILayout.HelpBox("进入 Play 模式后才会执行闪烁/定时协程。也可以在组件上启用 Auto Start On Enable 自动开始。", MessageType.Info); using (new EditorGUI.DisabledScope(!Application.isPlaying)) { using (new EditorGUILayout.HorizontalScope()) { if (GUILayout.Button("Start")) StartControl(); if (GUILayout.Button("Stop (Restore)")) StopControl(true); if (GUILayout.Button("Stop (No Restore)")) StopControl(false); } } } } void AddSelectedLights(bool includeChildren) { var selected = Selection.gameObjects; if (selected == null || selected.Length == 0) return; var toAdd = new List(); for (var i = 0; i < selected.Length; i++) { var go = selected[i]; if (go == null) continue; if (includeChildren) toAdd.AddRange(go.GetComponentsInChildren(true)); else { var l = go.GetComponent(); if (l != null) toAdd.Add(l); } } if (toAdd.Count == 0) return; foreach (var t in targets) { var c = (LightsControlController)t; Undo.RecordObject(c, "Add Lights"); c.AddLights(toAdd); EditorUtility.SetDirty(c); MarkSceneDirty(c); } } void FindAll(bool clearFirst) { foreach (var t in targets) { var c = (LightsControlController)t; Undo.RecordObject(c, "Find Lights In Scene"); c.FindAllLightsInScene(clearFirst); EditorUtility.SetDirty(c); MarkSceneDirty(c); } } void RemoveNulls() { foreach (var t in targets) { var c = (LightsControlController)t; Undo.RecordObject(c, "Remove Null Lights"); c.RemoveNullLights(); EditorUtility.SetDirty(c); MarkSceneDirty(c); } } void ClearList() { foreach (var t in targets) { var c = (LightsControlController)t; Undo.RecordObject(c, "Clear Lights"); c.ClearLights(); EditorUtility.SetDirty(c); MarkSceneDirty(c); } } void StartControl() { foreach (var t in targets) { var c = (LightsControlController)t; c.StartControl(); } } void StopControl(bool restoreBaseState) { foreach (var t in targets) { var c = (LightsControlController)t; c.StopControl(restoreBaseState); } } static void MarkSceneDirty(LightsControlController c) { if (Application.isPlaying) return; if (!c.gameObject.scene.IsValid()) return; EditorSceneManager.MarkSceneDirty(c.gameObject.scene); } }