This commit is contained in:
陈思海 2025-11-14 20:52:00 +08:00
parent 06dd5148d3
commit 0aa9e4f666

View File

@ -6,13 +6,16 @@ using UnityEditor.Experimental.GraphView;
using UnityEngine; using UnityEngine;
using UnityEngine.UIElements; using UnityEngine.UIElements;
namespace AlicizaX.AnimationFlow.Editor { namespace AlicizaX.AnimationFlow.Editor
public class SearchWindowProvider : ScriptableObject, ISearchWindowProvider { {
public class SearchWindowProvider : ScriptableObject, ISearchWindowProvider
{
private GraphWindow graphWindow; private GraphWindow graphWindow;
private GraphView graphView; private GraphView graphView;
private Texture2D icon; private Texture2D icon;
public void Initialize(GraphWindow graphWindow, GraphView graphView) { public void Initialize(GraphWindow graphWindow, GraphView graphView)
{
this.graphWindow = graphWindow; this.graphWindow = graphWindow;
this.graphView = graphView; this.graphView = graphView;
icon = new Texture2D(1, 1); icon = new Texture2D(1, 1);
@ -20,39 +23,56 @@ namespace AlicizaX.AnimationFlow.Editor {
icon.Apply(); icon.Apply();
} }
List<SearchTreeEntry> ISearchWindowProvider.CreateSearchTree(SearchWindowContext context) { List<SearchTreeEntry> ISearchWindowProvider.CreateSearchTree(SearchWindowContext context)
List<SearchTreeEntry> entries = new() { {
new SearchTreeGroupEntry(new GUIContent("Create Node",icon)) List<SearchTreeEntry> entries = new()
{
new SearchTreeGroupEntry(new GUIContent("Create Node", icon))
}; };
Dictionary<string, List<Type>> dicType = new(); Dictionary<string, List<Type>> dicType = new();
foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies()) { foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies())
foreach (var type in assembly.GetTypes()) { {
if (type.IsClass && !type.IsAbstract && type.IsSubclassOf(typeof(ActionNode))) { if (assembly.FullName.Contains("Sirenix")) continue;
foreach (var type in assembly.GetTypes())
{
if (type.IsClass && !type.IsAbstract && type.IsSubclassOf(typeof(ActionNode)))
{
CategoryAttribute categoryAttribute = type.GetCustomAttributes(typeof(CategoryAttribute), true).FirstOrDefault() as CategoryAttribute; CategoryAttribute categoryAttribute = type.GetCustomAttributes(typeof(CategoryAttribute), true).FirstOrDefault() as CategoryAttribute;
if (categoryAttribute == null || string.IsNullOrEmpty(categoryAttribute.category)) { if (categoryAttribute == null || string.IsNullOrEmpty(categoryAttribute.category))
{
NameAttribute nameAttribute = type.GetCustomAttributes(typeof(NameAttribute), true).FirstOrDefault() as NameAttribute; NameAttribute nameAttribute = type.GetCustomAttributes(typeof(NameAttribute), true).FirstOrDefault() as NameAttribute;
entries.Add(new SearchTreeEntry(new GUIContent(nameAttribute != null && !string.IsNullOrEmpty(nameAttribute.name) ? nameAttribute.name : type.Name, icon)) { level = 1, userData = type }); entries.Add(new SearchTreeEntry(new GUIContent(nameAttribute != null && !string.IsNullOrEmpty(nameAttribute.name) ? nameAttribute.name : type.Name, icon)) { level = 1, userData = type });
} else { }
if (dicType.TryGetValue(categoryAttribute.category, out var list)) { else
{
if (dicType.TryGetValue(categoryAttribute.category, out var list))
{
list.Add(type); list.Add(type);
} else { }
else
{
dicType.Add(categoryAttribute.category, new List<Type>() { type }); dicType.Add(categoryAttribute.category, new List<Type>() { type });
} }
} }
} }
} }
} }
foreach (var kv in dicType) {
foreach (var kv in dicType)
{
entries.Add(new SearchTreeGroupEntry(new GUIContent(kv.Key), 1)); entries.Add(new SearchTreeGroupEntry(new GUIContent(kv.Key), 1));
foreach (Type type in kv.Value) { foreach (Type type in kv.Value)
{
NameAttribute nameAttribute = type.GetCustomAttributes(typeof(NameAttribute), true).FirstOrDefault() as NameAttribute; NameAttribute nameAttribute = type.GetCustomAttributes(typeof(NameAttribute), true).FirstOrDefault() as NameAttribute;
entries.Add(new SearchTreeEntry(new GUIContent(nameAttribute != null && !string.IsNullOrEmpty(nameAttribute.name) ? nameAttribute.name : type.Name, icon)) { level = 2, userData = type }); entries.Add(new SearchTreeEntry(new GUIContent(nameAttribute != null && !string.IsNullOrEmpty(nameAttribute.name) ? nameAttribute.name : type.Name, icon)) { level = 2, userData = type });
} }
} }
return entries; return entries;
} }
bool ISearchWindowProvider.OnSelectEntry(SearchTreeEntry searchTreeEntry, SearchWindowContext context) { bool ISearchWindowProvider.OnSelectEntry(SearchTreeEntry searchTreeEntry, SearchWindowContext context)
{
var type = searchTreeEntry.userData as Type; var type = searchTreeEntry.userData as Type;
var data = Activator.CreateInstance(type) as ActionNode; var data = Activator.CreateInstance(type) as ActionNode;
data.uuid = Guid.NewGuid().ToString(); data.uuid = Guid.NewGuid().ToString();