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

Unity安卓构建中Input.GetMouseButtonUp(0)无法触发的问题求助

Unity安卓打包后Input.GetMouseButtonUp/TouchPhase.Ended不触发的解决方案

可能的原因

  • 安卓设备上,手指滑动移出屏幕时,触摸事件会触发TouchPhase.Canceled而非TouchPhase.Ended,原代码未处理该状态
  • UI元素的Raycast Target开启,拦截了触摸事件
  • Camera.main在安卓环境下可能获取不稳定,导致坐标计算异常
  • 碰撞体(bc)的Layer或状态设置问题,导致触摸检测逻辑异常

解决方案

1. 完整处理触摸事件的所有结束状态

修改触摸抬起的判断逻辑,加入TouchPhase.Canceled,覆盖手指移出屏幕的场景:

private Camera mainCam;

void Awake()
{
    // 缓存主相机引用,避免重复调用Camera.main
    mainCam = Camera.main;
}

void Update()
{
    if (mainCam == null) return;

    Vector2 mousePosition = mainCam.ScreenToWorldPoint(Input.mousePosition);

    // 处理按下逻辑
    bool isMouseDown = Input.GetMouseButtonDown(0);
    bool isTouchBegan = Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Began;
    if (isMouseDown || isTouchBegan)
    {
        // 排除UI点击干扰
        if (!EventSystem.current.IsPointerOverGameObject() && bc == Physics2D.OverlapPoint(mousePosition))
        {
            dragging = true;
        }
    }

    // 处理抬起/取消逻辑
    bool isMouseUp = Input.GetMouseButtonUp(0);
    bool isTouchFinished = Input.touchCount > 0 && 
        (Input.GetTouch(0).phase == TouchPhase.Ended || Input.GetTouch(0).phase == TouchPhase.Canceled);
    if (isMouseUp || isTouchFinished)
    {
        // 执行你的业务逻辑
        dragging = false;
        // make something
    }
}

2. 排除UI触摸拦截

  • 检查场景中所有UI元素的Raycast Target属性,若不需要接收触摸事件,将其关闭
  • 使用EventSystem.current.IsPointerOverGameObject()判断当前触摸是否在UI上,避免误触发逻辑

3. 验证碰撞体与相机设置

  • 确保bc对应的Collider2D处于启用状态,且所在Layer在Physics2D.OverlapPoint的检测范围内(若使用LayerMask参数)
  • 确认主相机的Tag设置为MainCamera,确保Camera.main能稳定获取到引用

4. 调试排查

  • 使用Unity Remote连接安卓设备,在Update中打印触摸状态日志,确认TouchPhase.Ended/Canceled是否被触发
  • 检查是否有其他脚本监听触摸事件,导致事件被抢占

内容的提问来源于stack exchange,提问作者Hernán Garcia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 10:23:24