输入与拖拽:把手指动作变成明确的命令
“支持拖拽”至少包含按下、移动、放下和取消四个阶段。玩家可能在棋盘外松手,也可能被弹窗打断。先把交互状态讲清楚,再选择 API。
两层问题,分开处理
第一层是设备:鼠标、触摸或手柄产生了什么输入?第二层是业务:这个输入是否意味着“选择某个物品”或“请求一次合成”?不要让鼠标坐标直接变成修改棋盘的权限。
| 场景 | 常用方案 | 需要配置 |
|---|---|---|
| Canvas 按钮和物品 | EventSystem + UI 指针接口 | GraphicRaycaster、可命中的 Graphic、输入模块 |
| 世界空间对象 | 指针位置 + 2D/3D 命中检测 | 相机、Layer、Collider、事件或射线方案 |
| 跨设备动作 | Input System 的 Action | 安装包、绑定、Action Map、启用与禁用 |
本手册合成案例优先使用 UGUI 的事件接口,如 IBeginDragHandler、IDragHandler、IEndDragHandler。工程可以选择旧输入模块或新 Input System 模块,但要明确一套主方案,避免重复响应。
拖拽是一段有边界的会话
开始拖动时记录源格、指针标识和抓取偏移。移动时只更新预览位置。放下时获取目标格,并提交一次命令。这样即使预览显示有偏差,也不会提前破坏棋盘状态。
UI 为什么点不到
按下面顺序检查,比不停改事件函数有效:
- 场景是否有有效 EventSystem,输入模块是否与当前输入方案匹配。
- Canvas 是否有合适的射线检测,目标 Graphic 是否允许 Raycast Target。
- 上层透明图片或弹窗是否挡住射线,CanvasGroup 是否禁止交互或阻挡。
- 世界对象是否使用了对应的物理射线方案,层级与相机是否正确。
- 是否真的开始在目标对象上按下,而不是移动后才进入它。
拖拽物品可能挡住目标格的检测。常见做法是拖动期间让物品视图不阻挡目标命中,在结束与取消路径里恢复。别永久关掉射线后忘记恢复。
多点触摸与前后台
如果玩法只允许一个拖拽,就锁定本次指针 ID,明确拒绝或忽略第二根手指。不要让两次输入同时修改同一个源格。
小游戏进入后台、弹出系统界面或广告展示时,拖拽可能没有正常结束。应提供一个取消入口,能清理高亮、恢复视图位置并释放交互锁。生命周期事件来源由平台适配层统一提供。
给 AI 的任务示例
在 Screen Space - Overlay Canvas 的 4×4 棋盘中实现单指拖拽。拖动时不修改棋盘数据;放下才提交源格和目标格。越界、同格、被弹窗打断都恢复原位。列出 EventSystem、输入模块、CanvasGroup 与射线配置。
验收覆盖鼠标与真机触摸、边缘抓取、快速松手、第二根手指和中断恢复。参考:Input Actions、UGUI 事件接口。