AlicizaX/Client/Packages/com.alicizax.uxtool/Editor/UXGUI/SceneView/UXCustomSceneView.cs

68 lines
1.8 KiB
C#
Raw Normal View History

2025-12-01 16:46:28 +08:00
using System;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
/// <summary>
/// 在多 SceneView 窗口下安全地添加/移除临时回调。
/// 原理Templist 存放需在下一帧执行的回调OnSceneGUI 将会把 Templist 转移到 list 来执行。
/// </summary>
public class UXCustomSceneView
{
static private List<Action<SceneView>> list = new List<Action<SceneView>>();
static private List<Action<SceneView>> Templist = new List<Action<SceneView>>();
[InitializeOnLoadMethod]
static void Init()
{
list.Clear();
Templist.Clear();
SceneView.duringSceneGui -= OnSceneGUI;
SceneView.duringSceneGui += OnSceneGUI;
}
static public void AddDelegate(Action<SceneView> method)
{
if (method == null) return;
// 去重
if (!Templist.Contains(method))
Templist.Add(method);
}
static public void RemoveDelegate(Action<SceneView> method)
{
if (method == null) return;
var idx = Templist.FindIndex(i => i == method);
if (idx >= 0) Templist.RemoveAt(idx);
}
static public void OnSceneGUI(SceneView sceneView)
{
// 执行上一帧注册的 list
foreach (Action<SceneView> method in list)
{
try
{
method.Invoke(sceneView);
}
catch (Exception e)
{
Debug.LogException(e);
}
}
list.Clear();
// 将 Templist 拷贝到 list并在下一帧执行这样可以避免在枚举时修改集合的问题
foreach (Action<SceneView> method in Templist)
{
if (!list.Contains(method))
list.Add(method);
}
}
static public void ClearDelegate()
{
Templist.Clear();
}
}