#if ENABLE_INPUT_SYSTEM
using XericLibrary.Runtime.MacroLibrary;
using UnityEngine;
using UnityEngine.InputSystem;
namespace XericLibrary.Runtime.Blueprint
{
///
/// 蓝图输入工具(新输入系统)—— 自身管理 InputActionAsset 绑定和快捷键回调,
/// 不再依赖 BlueprintInputManager 管理器。
///
[BlueprintTool(phase: ToolPhase.PreUpdate, order: 1)]
public class BlueprintInputTool_InputSystem : BlueprintInputTool_UGUI
{
private InputActionAsset _inputActionAsset;
private InputActionMap _activeMap;
// 缓存的动作回调实例
private System.Action _panHandler;
private System.Action _panCanceled;
private System.Action _zoomHandler;
private System.Action _zoomCanceled;
private System.Action _homeHandler;
private System.Action _undoHandler;
private System.Action _redoHandler;
private System.Action _parentHandler;
// ===== InputActionAsset 属性 =====
public InputActionAsset InputActionAsset
{
get => _inputActionAsset;
set
{
if (_inputActionAsset == value) return;
UnbindCurrent();
_inputActionAsset = value;
if (_inputActionAsset != null && Graph != null)
BindCurrent();
}
}
// ===== 生命周期 =====
public override void OnInitialize()
{
// 创建回调委托(确保 Bind/Unbind 使用同一引用)
_panHandler = ctx => PanDirection = ctx.ReadValue();
_panCanceled = _ => PanDirection = Vector2.zero;
_zoomHandler = ctx => ZoomAxis = ctx.ReadValue();
_zoomCanceled = _ => ZoomAxis = 0f;
_homeHandler = _ => DispatchShortcut(BlueprintInputConstants.FocusHome);
_undoHandler = _ => DispatchShortcut(BlueprintInputConstants.Undo);
_redoHandler = _ => DispatchShortcut(BlueprintInputConstants.Redo);
_parentHandler = _ => DispatchShortcut(BlueprintInputConstants.NavigateParent);
base.OnInitialize();
RegisterShortcutHandlers();
}
public override void OnDestroy()
{
UnbindCurrent();
base.OnDestroy();
}
// ===== ActionMap 绑定/解绑 =====
private void BindCurrent()
{
if (_inputActionAsset == null) return;
var map = _inputActionAsset.FindActionMap(BlueprintInputConstants.MapName);
if (map == null) return;
map.Enable();
Bind(map, BlueprintInputConstants.Pan, _panHandler);
BindCancel(map, BlueprintInputConstants.Pan, _panCanceled);
Bind(map, BlueprintInputConstants.Zoom, _zoomHandler);
BindCancel(map, BlueprintInputConstants.Zoom, _zoomCanceled);
Bind(map, BlueprintInputConstants.FocusHome, _homeHandler);
Bind(map, BlueprintInputConstants.Undo, _undoHandler);
Bind(map, BlueprintInputConstants.Redo, _redoHandler);
Bind(map, BlueprintInputConstants.NavigateParent, _parentHandler);
_activeMap = map;
}
private void UnbindCurrent()
{
if (_activeMap == null) return;
Unbind(_activeMap, BlueprintInputConstants.Pan, _panHandler);
UnbindCancel(_activeMap, BlueprintInputConstants.Pan, _panCanceled);
Unbind(_activeMap, BlueprintInputConstants.Zoom, _zoomHandler);
UnbindCancel(_activeMap, BlueprintInputConstants.Zoom, _zoomCanceled);
Unbind(_activeMap, BlueprintInputConstants.FocusHome, _homeHandler);
Unbind(_activeMap, BlueprintInputConstants.Undo, _undoHandler);
Unbind(_activeMap, BlueprintInputConstants.Redo, _redoHandler);
Unbind(_activeMap, BlueprintInputConstants.NavigateParent, _parentHandler);
_activeMap.Disable();
_activeMap = null;
}
private static void Bind(InputActionMap map, string name, System.Action handler)
{
var action = map.FindAction(name);
if (action != null) action.performed += handler;
}
private static void Unbind(InputActionMap map, string name, System.Action handler)
{
var action = map.FindAction(name);
if (action != null) action.performed -= handler;
}
private static void BindCancel(InputActionMap map, string name, System.Action handler)
{
var action = map.FindAction(name);
if (action != null) action.canceled += handler;
}
private static void UnbindCancel(InputActionMap map, string name, System.Action handler)
{
var action = map.FindAction(name);
if (action != null) action.canceled -= handler;
}
private void DispatchShortcut(string actionName)
{
if (Graph == null) return;
Graph.MarkDirty();
BlueprintToolProvider.DispatchAction(Graph, this, actionName);
}
// ===== 快捷键树注册 =====
private void RegisterShortcutHandlers()
{
var tree = MacroKey.ShortcutTreeInstance;
RegisterAction(tree, BlueprintInputConstants.Undo);
RegisterAction(tree, BlueprintInputConstants.Redo);
RegisterAction(tree, BlueprintInputConstants.FocusHome);
RegisterAction(tree, BlueprintInputConstants.DeleteSelected);
RegisterAction(tree, BlueprintInputConstants.SelectAll);
RegisterAction(tree, BlueprintInputConstants.Duplicate);
RegisterAction(tree, BlueprintInputConstants.Copy);
RegisterAction(tree, BlueprintInputConstants.Paste);
RegisterAction(tree, BlueprintInputConstants.Cut);
RegisterAction(tree, BlueprintInputConstants.Save);
}
private void RegisterAction(ShortcutTree tree, string alias)
{
tree.RegisterAlias(alias, () => BlueprintToolProvider.DispatchAction(Graph, this, alias));
tree.RebindAlias(alias, () => BlueprintToolProvider.DispatchAction(Graph, this, alias));
}
}
}
#endif