com.alicizax.unity.framework/Editor/FSM/FsmDebuggerWindow.cs
2025-09-05 19:46:30 +08:00

122 lines
3.7 KiB
C#

// ===================== FSMDebugger Window (unchanged API, auto-binding now) =====================
using AlicizaX.Fsm;
using UnityEditor;
using UnityEngine;
internal class FsmDebuggerWindow : EditorWindow
{
[MenuItem("Window/HighPerfFSM Debugger")]
public static void ShowWindow()
{
var win = GetWindow<FsmDebuggerWindow>("FSM Debugger");
win.Show();
}
private Vector2 _scroll;
private bool _autoRefresh = true;
private void OnEnable()
{
FSMDebugger.SetEnabled(true);
EditorApplication.update += RepaintIfNeeded;
}
private void OnDisable()
{
EditorApplication.update -= RepaintIfNeeded;
}
private void RepaintIfNeeded()
{
if (_autoRefresh) Repaint();
}
private void OnGUI()
{
using (new EditorGUILayout.HorizontalScope(EditorStyles.toolbar))
{
GUILayout.Label("HighPerfFSM Debugger", EditorStyles.boldLabel);
GUILayout.FlexibleSpace();
_autoRefresh = GUILayout.Toggle(_autoRefresh, "Auto Refresh", EditorStyles.toolbarButton);
}
_scroll = EditorGUILayout.BeginScrollView(_scroll);
foreach (var kv in FSMDebugger.Entries)
{
var entry = kv.Value;
EditorGUILayout.BeginVertical("box");
using (new EditorGUILayout.HorizontalScope())
{
GUILayout.Label($"ID: {entry.Id}", GUILayout.Width(90));
GUILayout.Label(entry.Name, EditorStyles.boldLabel);
GUILayout.FlexibleSpace();
}
var stateName = (entry.StateNameGetter != null)
? entry.StateNameGetter(entry.StateIndex) ?? entry.StateIndex.ToString()
: entry.StateIndex.ToString();
EditorGUILayout.LabelField("State", stateName);
EditorGUILayout.LabelField("TimeInState", entry.TimeInState.ToString("F3"));
if (entry.BlackboardGetter != null && entry.Fields != null)
{
object bbObj = null;
try
{
bbObj = entry.BlackboardGetter();
}
catch
{
}
if (bbObj != null)
{
EditorGUILayout.LabelField("Blackboard");
EditorGUI.indentLevel++;
for (int i = 0; i < entry.Fields.Length; i++)
{
var f = entry.Fields[i];
object val = null;
try
{
val = f.GetValue(bbObj);
}
catch
{
}
EditorGUILayout.LabelField(f.Name, val != null ? val.ToString() : "null");
}
EditorGUI.indentLevel--;
}
else
{
EditorGUILayout.HelpBox("Blackboard getter returned null.", MessageType.Info);
}
}
if (entry.Owner != null && entry.Owner.TryGetTarget(out var owner) && owner != null)
{
EditorGUILayout.ObjectField("Owner", owner, typeof(UnityEngine.Object), true);
}
EditorGUILayout.EndVertical();
GUILayout.Space(4);
}
EditorGUILayout.EndScrollView();
if (GUILayout.Button("Clear All (Unregister)"))
{
var ids = new System.Collections.Generic.List<int>();
foreach (var kv in FSMDebugger.Entries) ids.Add(kv.Key);
foreach (var id in ids) FSMDebugger.Unregister(id);
}
}
}