Unity安卓构建中Input.GetMouseButtonUp(0)无法触发的问题求助
可能的原因
- 安卓设备上,手指滑动移出屏幕时,触摸事件会触发
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
相关产品推荐
相关产品推荐

