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

68 lines
1.8 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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();
}
}