ClickerExtensions

5 阅读4分钟

概述(Overview)

ClickerExtensions 是一个专注于 Unity 中交互事件(点击、指针事件) 的静态扩展方法集合,位于 PFGameFramework.Library 命名空间。

主要功能包括:

  • 2D UI(使用 EventTrigger)与 3D 物体交互事件的绑定
  • 同步添加事件监听(Action / UnityAction)
  • 异步等待点击事件(UniTask + CancellationToken 支持)
  • 自动点击模拟(用于自动化测试、教学跳过、演示模式)
  • 基于射线检测的 3D 物体点击判断
  • 鼠标拖拽、滚轮缩放等常用交互辅助方法

适用于交互教学、实验步骤引导、自动化测试、物体拖拽等场景。 注意:部分方法依赖 EventTrigger + PhysicsRaycaster(3D)或 Canvas 下的 UI 事件系统。


方法一览(API Index)

方法名目标类型异步返回类型主要功能典型用途
OnEventTriggerAddListenerGameObject / Componentvoid添加 EventTrigger 监听(支持 Action / UniTask)快速绑定指针事件
OnClickAsync3DGameObjectUniTask异步等待 3D 物体被点击(EventTrigger 版)步骤等待 3D 交互
OnClickAsync3D1GameObjectUniTask异步等待 3D 物体被点击(射线检测轮询版)更可靠的 3D 点击等待(无 EventTrigger)
OnClickAsync2DComponent (UI)UniTask异步等待 2D UI 被点击等待按钮/图片点击
OnAutoClickAsync2DComponent (UI)UniTask支持自动模拟点击的 2D 等待教学/演示自动跳过
OnAutoClickAsync3DGameObjectUniTask支持自动模拟点击的 3D 等待教学/演示自动跳过 3D 对象
AddListener (EventTrigger)EventTriggervoid简洁添加 EventTrigger 事件链式调用
AddListener (Button)Buttonvoid简洁添加 Button onClick 监听快速绑定按钮
OnPointerClick/Enter/ExitAddListenerButtonvoid为 Button 添加特定指针事件增强按钮交互(悬停、离开等)
Clicked3dObjectAsyncUniTask异步等待任意 3D 物体被点击并返回对象自由点击选择物体
DragObjectViaMouseGameObjectvoid3D 物体跟随鼠标拖拽简单拖拽交互
Drag2dObjectViaMouseGameObjectvoid2D 物体跟随鼠标位置(屏幕空间)UI 拖拽或指示器
PushPullObjectViaMouseScrollGameObjectvoid鼠标滚轮推拉物体距离物体放大/缩小观察

方法详情

异步点击等待(推荐使用)

OnClickAsync3D(推荐 EventTrigger 版)

/// <summary>
/// 异步等待 3D 物体被点击(PointerClick),支持自动模拟点击
/// 需要相机上有 PhysicsRaycaster 组件
/// </summary>
public static async UniTask OnClickAsync3D(this GameObject obj, CancellationToken ctk)

特点

  • 自动添加 BoxCollider 和 EventTrigger
  • 支持 AutoClickManager.EnableAutoClick 自动跳过
  • 事件监听在完成后自动移除

OnClickAsync3D1(射线检测版)

/// <summary>
/// 异步等待 3D 物体被点击(纯射线检测轮询,不依赖 EventTrigger)
/// 更可靠,但每帧有少量开销
/// </summary>
public static async UniTask OnClickAsync3D1(this GameObject obj, CancellationToken ctk)

适用场景:EventTrigger 方案失效或不想添加组件时。

OnClickAsync2D

/// <summary>
/// 异步等待 2D UI 组件被点击(PointerClick)
/// 支持自动模拟点击
/// </summary>
public static async UniTask OnClickAsync2D<T>(this T component, CancellationToken ctk)
    where T : Component

典型用法

await myButton.OnClickAsync2D(cts.Token);
Debug.Log("按钮被点击!");

自动点击支持

OnAutoClickAsync2D / OnAutoClickAsync3D

/// <summary>
/// 支持自动模拟点击的 2D/3D 等待
/// 通过 GlobalManager.AutoComplete 控制
/// </summary>
public static async UniTask OnAutoClickAsync2D<T>(this T button, CancellationToken token, float delay = 1)

用途:教学模式、演示录制、跳过手动操作。


事件绑定(同步)

OnEventTriggerAddListener(多重载)

// 绑定异步方法
public static void OnEventTriggerAddListener(this GameObject obj, Func<UniTask> function, EventTriggerType eventType = EventTriggerType.PointerClick)

// 绑定同步方法
public static void OnEventTriggerAddListener(this GameObject obj, Action fn, EventTriggerType eventType = EventTriggerType.PointerClick)

// 泛型组件版本
public static void OnEventTriggerAddListener<T>(this T component, Action<PointerEventData> onClickAction, EventTriggerType eventType = EventTriggerType.PointerClick)
    where T : Component

指针事件快捷绑定(Button 专用)

public static void OnPointerClickAddListener(this Button button, Action action)
public static void OnPointerEnterAddListener(this Button button, Action action)
public static void OnPointerExitAddListener(this Button button, Action action)

支持异步 lambda

button.OnPointerEnterAddListener(async () => {
    await UniTask.Delay(300);
    Debug.Log("悬停后延迟显示");
});

3D 物体点击检测(不等待特定对象)

/// <summary>
/// 异步等待任意 3D 物体被点击(有 MeshRenderer),返回被点击的对象
/// </summary>
public static async UniTask<GameObject> Clicked3dObjectAsync(Camera camera)

同步版本

public static GameObject Clicked3dObject(Camera camera)

拖拽与交互辅助

// 3D 物体跟随鼠标拖拽(保持与相机距离)
public static void DragObjectViaMouse(GameObject obj)
public static void DragObjectViaMouse(GameObject obj, float distance)

// 2D 物体直接跟随鼠标屏幕坐标
public static void Drag2dObjectViaMouse(this GameObject obj)

// 鼠标滚轮推拉物体
public static void PushPullObjectViaMouseScroll(GameObject obj)

推荐:在 OnDrag 或 Update 中调用实现拖拽功能。