Unity3D中如何获取滑动操作的角度?
Unity3D 获取滑动角度并判断滑动方向
先修正变量赋值错误
你当前代码里的起始点和终点赋值搞反了:按下鼠标时应该记录滑动起始点,抬起时记录终点,否则计算的方向向量会完全反向。修正后的Update函数如下:
private Vector2 fingerDown; private Vector2 fingerUp; public float SwipeThreshold = 50f; // 可自定义的滑动最小距离阈值 public UnityEvent onSwipeUp; public UnityEvent onSwipeDown; public UnityEvent onSwipeLeft; public UnityEvent onSwipeRight; private void Update() { if (Input.GetMouseButtonDown(0)) { fingerDown = Input.mousePosition; fingerUp = fingerDown; } if (Input.GetMouseButtonUp(0)) { fingerUp = Input.mousePosition; CheckSwipe(); } }
计算滑动角度的正确方法
使用Mathf.Atan2计算方向向量的弧度值,再转换为角度,同时将负角度转换为0-360°的范围,适配你的方向判断逻辑:
private void CheckSwipe() { Vector2 direction = fingerUp - fingerDown; // 过滤短距离操作,避免误判 if (direction.magnitude < SwipeThreshold) { return; } // 计算角度:将弧度转为角度,并修正为0-360°范围 float angle = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg; if (angle < 0) { angle += 360; } // 修正方向判断区间(原区间逻辑有误,已调整) if (angle >= 45 && angle < 135) { onSwipeUp?.Invoke(); } else if (angle >= 135 && angle < 225) { onSwipeLeft?.Invoke(); } else if (angle >= 225 && angle < 315) { onSwipeDown?.Invoke(); } else // 0°-45° 或 315°-360° { onSwipeRight?.Invoke(); } }
关键说明
- 变量命名:改用驼峰式命名(
fingerUp/fingerDown)符合C#编码规范,避免歧义。 - 空引用防护:使用
?.Invoke()替代直接Invoke(),防止事件未绑定时抛出空引用异常。 - 角度逻辑:
Mathf.Atan2(direction.y, direction.x)以屏幕右方向为0°,顺时针递增,因此对应的方向区间需要匹配这个规则(原代码中135-225°的方向判断错误,已修正为向左)。
内容的提问来源于stack exchange,提问作者njnjnj
相关产品推荐
相关产品推荐

