跳到主要内容

输入与拖拽:把手指动作变成明确的命令

“支持拖拽”至少包含按下、移动、放下和取消四个阶段。玩家可能在棋盘外松手,也可能被弹窗打断。先把交互状态讲清楚,再选择 API。

两层问题,分开处理​

第一层是设备:鼠标、触摸或手柄产生了什么输入?第二层是业务:这个输入是否意味着“选择某个物品”或“请求一次合成”?不要让鼠标坐标直接变成修改棋盘的权限。

场景常用方案需要配置
Canvas 按钮和物品EventSystem + UI 指针接口GraphicRaycaster、可命中的 Graphic、输入模块
世界空间对象指针位置 + 2D/3D 命中检测相机、Layer、Collider、事件或射线方案
跨设备动作Input System 的 Action安装包、绑定、Action Map、启用与禁用

本手册合成案例优先使用 UGUI 的事件接口,如 IBeginDragHandler、IDragHandler、IEndDragHandler。工程可以选择旧输入模块或新 Input System 模块,但要明确一套主方案,避免重复响应。

拖拽是一段有边界的会话​

开始拖动时记录源格、指针标识和抓取偏移。移动时只更新预览位置。放下时获取目标格,并提交一次命令。这样即使预览显示有偏差,也不会提前破坏棋盘状态。

UI 为什么点不到​

按下面顺序检查,比不停改事件函数有效:

  1. 场景是否有有效 EventSystem,输入模块是否与当前输入方案匹配。
  2. Canvas 是否有合适的射线检测,目标 Graphic 是否允许 Raycast Target。
  3. 上层透明图片或弹窗是否挡住射线,CanvasGroup 是否禁止交互或阻挡。
  4. 世界对象是否使用了对应的物理射线方案,层级与相机是否正确。
  5. 是否真的开始在目标对象上按下,而不是移动后才进入它。

拖拽物品可能挡住目标格的检测。常见做法是拖动期间让物品视图不阻挡目标命中,在结束与取消路径里恢复。别永久关掉射线后忘记恢复。

多点触摸与前后台​

如果玩法只允许一个拖拽,就锁定本次指针 ID,明确拒绝或忽略第二根手指。不要让两次输入同时修改同一个源格。

小游戏进入后台、弹出系统界面或广告展示时,拖拽可能没有正常结束。应提供一个取消入口,能清理高亮、恢复视图位置并释放交互锁。生命周期事件来源由平台适配层统一提供。

给 AI 的任务示例​

在 Screen Space - Overlay Canvas 的 4×4 棋盘中实现单指拖拽。拖动时不修改棋盘数据;放下才提交源格和目标格。越界、同格、被弹窗打断都恢复原位。列出 EventSystem、输入模块、CanvasGroup 与射线配置。

验收覆盖鼠标与真机触摸、边缘抓取、快速松手、第二根手指和中断恢复。参考:Input Actions、UGUI 事件接口。