You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 17:45:05