Files
Echo/Assets/_Project/Scripts/Lights Control/Editor/LightsControlControllerEditor.cs
T

174 lines
4.7 KiB
C#
Raw Normal View History

2026-07-08 19:53:15 +08:00
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<Light>();
for (var i = 0; i < selected.Length; i++)
{
var go = selected[i];
if (go == null)
continue;
if (includeChildren)
toAdd.AddRange(go.GetComponentsInChildren<Light>(true));
else
{
var l = go.GetComponent<Light>();
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);
}
}