如何在Unity中通过脚本模拟触发touch/click触摸点击事件
Unity 人工构造触发触摸事件的实现方案
下面提供两种适配不同输入系统的简洁实现,都不需要重复编写射线检测逻辑:
方案1:基于EventSystem模拟点击(兼容旧版Input Manager)
该方案无需修改原有触摸/点击处理逻辑,自动适配UGUI与实现了IPointerClickHandler等指针事件接口的3D/2D物体
首先引用必要命名空间:
using UnityEngine.EventSystems; using System.Collections.Generic;
封装模拟点击方法:
void SimulateClickAtPosition(Vector2 screenPos) { PointerEventData eventData = new PointerEventData(EventSystem.current); eventData.position = screenPos; List<RaycastResult> raycastResults = new List<RaycastResult>(); // 复用Unity内置射线检测逻辑,覆盖UI和场景物体 EventSystem.current.RaycastAll(eventData, raycastResults); foreach (var result in raycastResults) { // 依次触发按下、点击、抬起事件,和真实点击逻辑完全一致 ExecuteEvents.Execute(result.gameObject, eventData, ExecuteEvents.pointerDownHandler); ExecuteEvents.Execute(result.gameObject, eventData, ExecuteEvents.pointerClickHandler); ExecuteEvents.Execute(result.gameObject, eventData, ExecuteEvents.pointerUpHandler); } }
你原有触发逻辑直接调用即可:
if (Input.GetKeyDown(KeyCode.Q)) { SimulateClickAtPosition(currentCursorPos); }
方案2:新版Input System直接注入模拟触摸
如果你的项目使用的是新版Input System,可以直接向输入系统注入人工构造的触摸数据,全局生效,所有读取触摸输入的代码都会正常响应,和真实触摸完全无差异:
首先确认已经安装Input System包,引用命名空间:
using UnityEngine.InputSystem;
触发逻辑示例:
if (Input.GetKeyDown(KeyCode.Q)) { // 构造触摸按下事件 Touch simulatedTouch = new Touch { phase = TouchPhase.Began, position = currentCursorPos, fingerId = 999 // 取不会和真实触摸冲突的ID即可 }; InputSystem.EnqueueTouch(simulatedTouch); // 延迟一帧注入触摸结束事件,模拟单次点击 simulatedTouch.phase = TouchPhase.Ended; InputSystem.QueueDelayedEvent(simulatedTouch, 0.016f); }
内容的提问来源于stack exchange,提问作者MyBug18
相关产品推荐
相关产品推荐

