# update 0.6.2.1

更新了蓝图组件相关的用法。
This commit is contained in:
2026-07-15 10:36:16 +08:00
parent 155641f2ef
commit 7f3a12cae0
25 changed files with 1102 additions and 877 deletions
@@ -1,45 +1,19 @@
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
namespace XericLibrary.Runtime.Blueprint
{
/// <summary>
/// 蓝图 UGUI 输入管理器 —— 负责绑定 UGUI EventTrigger 到背景 Image,
/// 将 UGUI 指针事件转发到 <see cref="BlueprintToolProvider"/> 的分发方法。
/// <para>
/// 该类仅处理与 UGUI EventTrigger 相关的绑定逻辑,不感知新旧输入系统的差异。
/// 由 <see cref="BlueprintInputReceiver"/> 创建并在 OnUpdate 中驱动。
/// </para>
/// 蓝图 UGUI 输入工具静态辅助类。
/// 提供跨新旧输入系统的统一鼠标位置和按钮状态查询。
/// </summary>
public class BlueprintUGUIInputManager
public static class BlueprintUGUIInputManager
{
/// <summary>
/// 当前帧鼠标/指针在屏幕空间的位置。
/// 每帧由 <see cref="UpdateMousePosition"/> 刷新。
/// </summary>
public static Vector2 MousePosition { get; private set; }
/// <summary>当前帧鼠标/指针在屏幕空间的位置,每帧由 BlueprintInputTool_UGUI 更新。</summary>
public static Vector2 MousePosition { get; internal set; }
/// <summary>
/// 当前帧鼠标/指针是否处于新输入系统模式。
/// <c>true</c> = 新输入系统(<c>ENABLE_INPUT_SYSTEM</c> 已定义);
/// <c>false</c> = 旧输入系统。
/// </summary>
public static bool IsNewInputSystem
{
get
{
#if ENABLE_INPUT_SYSTEM
return true;
#else
return false;
#endif
}
}
/// <summary>
/// 更新静态鼠标位置。每帧由 BlueprintInputReceiver 的 OnUpdate 调用。
/// 内部根据条件编译选择鼠标位置读取源。
/// 更新静态鼠标位置。
/// 由 <see cref="BlueprintInputTool_UGUI"/> 每帧在 OnUpdate 中调用。
/// </summary>
public static void UpdateMousePosition()
{
@@ -52,7 +26,6 @@ namespace XericLibrary.Runtime.Blueprint
/// <summary>
/// 返回当前是否按住指定鼠标按钮。
/// 内部根据条件编译选择检测方式。
/// </summary>
/// <param name="button">0=左键, 1=右键, 2=中键</param>
public static bool IsButtonPressed(int button)
@@ -71,169 +44,5 @@ namespace XericLibrary.Runtime.Blueprint
return Input.GetMouseButton(button);
#endif
}
// ===== 实例部分 =====
private BlueprintGraph _graph;
private Transform _bgTransform;
private EventTrigger _eventTrigger;
private bool _isBound;
// 背景 GameObject 名称(与 QuickUGUIGraphGridBackgroundTool 一致)
private const string BackgroundGoName = "__Bp_GridBackground";
// ===== 生命周期 =====
/// <summary>初始化 UGUI 输入管理器并绑定到指定蓝图。</summary>
public BlueprintUGUIInputManager(BlueprintGraph graph)
{
_graph = graph;
}
/// <summary>
/// 尝试绑定 EventTrigger 到背景 Image。
/// 返回 <c>true</c> 表示绑定成功,<c>false</c> 表示背景尚未创建。
/// </summary>
public bool TryBind()
{
if (_isBound) return true;
if (_graph?.Canvas == null) return false;
var root = _graph.Canvas.GetRootTransform();
if (root == null) return false;
_bgTransform = root.Find(BackgroundGoName);
if (_bgTransform == null) return false;
_eventTrigger = _bgTransform.gameObject.GetComponent<EventTrigger>();
if (_eventTrigger == null)
_eventTrigger = _bgTransform.gameObject.AddComponent<EventTrigger>();
else
_eventTrigger.triggers.Clear();
BindEventTrigger();
_isBound = true;
return true;
}
/// <summary>解绑并清理 EventTrigger。</summary>
public void Unbind()
{
if (_eventTrigger != null)
{
_eventTrigger.triggers.Clear();
_eventTrigger = null;
}
_bgTransform = null;
_isBound = false;
}
/// <summary>是否已绑定。</summary>
public bool IsBound => _isBound;
/// <summary>背景 RectTransform(用于屏幕点包含检测)。</summary>
public RectTransform BgRectTransform => _bgTransform as RectTransform;
// ===== EventTrigger 绑定 =====
private void BindEventTrigger()
{
if (_eventTrigger == null) return;
AddEntry(EventTriggerType.PointerEnter, OnEventPointerEnter);
AddEntry(EventTriggerType.PointerExit, OnEventPointerExit);
AddEntry(EventTriggerType.PointerDown, OnEventPointerDown);
AddEntry(EventTriggerType.PointerUp, OnEventPointerUp);
AddEntry(EventTriggerType.BeginDrag, OnEventBeginDrag);
AddEntry(EventTriggerType.Drag, OnEventDrag);
AddEntry(EventTriggerType.EndDrag, OnEventEndDrag);
AddEntry(EventTriggerType.Scroll, OnEventScroll);
}
private void AddEntry(EventTriggerType eventType, UnityEngine.Events.UnityAction<BaseEventData> callback)
{
var entry = new EventTrigger.Entry { eventID = eventType };
entry.callback.AddListener(callback);
_eventTrigger.triggers.Add(entry);
}
// ===== 坐标转换 =====
private Vector2 ScreenToCanvas(Vector2 screenPos)
{
return _graph?.Canvas != null ? _graph.Canvas.ScreenToCanvas(screenPos) : screenPos;
}
private Vector2 ScreenToCanvas(PointerEventData data)
{
return ScreenToCanvas(data.position);
}
// ===== EventTrigger 回调 =====
private void OnEventPointerEnter(BaseEventData _)
{
if (_graph != null)
BlueprintToolProvider.DispatchPointerEnter(_graph);
}
private void OnEventPointerExit(BaseEventData _)
{
if (_graph != null)
BlueprintToolProvider.DispatchPointerExit(_graph);
}
private void OnEventPointerDown(BaseEventData data)
{
if (_graph == null || !(data is PointerEventData pData)) return;
_graph.BeginFrame();
var pt = ScreenToCanvas(pData);
_graph.MarkDirty();
BlueprintToolProvider.DispatchPointerDown(_graph, pt, (int)pData.button);
}
private void OnEventPointerUp(BaseEventData data)
{
if (_graph == null || !(data is PointerEventData pData)) return;
var pt = ScreenToCanvas(pData);
BlueprintToolProvider.DispatchPointerUp(_graph, pt, (int)pData.button);
}
// 拖拽状态
private int _dragButton = -1;
private Vector2 _dragStartPos;
private void OnEventBeginDrag(BaseEventData data)
{
if (_graph == null || !(data is PointerEventData pData)) return;
_dragButton = (int)pData.button;
_dragStartPos = ScreenToCanvas(pData);
}
private void OnEventDrag(BaseEventData data)
{
if (_graph == null || !(data is PointerEventData pData)) return;
var current = ScreenToCanvas(pData);
var delta = current - _dragStartPos;
_dragStartPos = current;
BlueprintToolProvider.DispatchPointerDrag(_graph, current, delta, _dragButton);
}
private void OnEventEndDrag(BaseEventData data)
{
if (_graph == null || !(data is PointerEventData pData)) return;
BlueprintToolProvider.DispatchPointerUp(_graph, ScreenToCanvas(pData), (int)pData.button);
_dragButton = -1;
}
private void OnEventScroll(BaseEventData data)
{
if (_graph == null || !(data is PointerEventData pData)) return;
_graph.BeginFrame();
var pt = ScreenToCanvas(pData);
var scroll = new Vector2(-pData.scrollDelta.x, -pData.scrollDelta.y);
_graph.MarkDirty();
BlueprintToolProvider.DispatchScroll(_graph, pt, scroll);
}
}
}