using System; using System.Collections.Generic; using UnityEngine; namespace BF { public static class BFGesture { /// /// 获取当前手势中心屏幕坐标 /// public static Vector2 GetScreenCenter() { return GetScreenCenter(BFMain.Instance.TouchMgr.fingers); } /// /// 获取手势中心屏幕坐标 /// public static Vector2 GetScreenCenter(List fingers) { var center = Vector2.zero; TryGetScreenCenter(fingers, ref center); return center; } /// /// 获取手势中心屏幕坐标 /// private static bool TryGetScreenCenter(List fingers, ref Vector2 center) { if (fingers != null) { var total = Vector2.zero; var count = 0; for (int i = fingers.Count - 1; i >= 0; i--) { BFFinger finger = fingers[i]; if (finger != null) { total += finger.curScreenPos; count += 1; } } if (count > 0) { center = total / count; return true; } } return false; } /// /// 获取手势上一帧中心屏幕坐标 /// public static Vector2 GetLastScreenCenter() { return GetLastScreenCenter(BFMain.Instance.TouchMgr.fingers); } /// /// 获取手势上一帧中心屏幕坐标 /// public static Vector2 GetLastScreenCenter(List fingers) { var center = Vector2.zero; TryGetLastScreenCenter(fingers, ref center); return center; } /// /// 获取手势上一帧中心屏幕坐标 /// static bool TryGetLastScreenCenter(List fingers, ref Vector2 center) { if (fingers != null) { var total = Vector2.zero; var count = 0; for (int i = fingers.Count - 1; i >= 0; i--) { BFFinger finger = fingers[i]; if (finger != null) { total += finger.lastScreenPos; count += 1; } } if (count > 0) { center = total / count; return true; } } return false; } /// /// 获取手势起始中心屏幕坐标 /// public static Vector2 GetStartScreenCenter() { return GetStartScreenCenter(BFMain.Instance.TouchMgr.fingers); } /// /// 获取手势起始中心屏幕坐标 /// public static Vector2 GetStartScreenCenter(List fingers) { var center = Vector2.zero; TryGetScreenCenter(fingers, ref center); return center; } /// /// 获取手势起始中心屏幕坐标 /// static bool TryGetStartScreenCenter(List fingers, ref Vector2 center) { if (fingers != null) { var total = Vector2.zero; var count = 0; for (int i = fingers.Count - 1; i >= 0; i--) { var finger = fingers[i]; if (finger != null) { total += finger.startScreenPos; count += 1; } } if (count > 0) { center = total / count; return true; } } return false; } /// /// 获取所有手指平均的屏幕坐标增量 /// public static Vector2 GetScreenDelta() { return GetScreenDelta(BFMain.Instance.TouchMgr.fingers); } /// /// 获取手指平均的屏幕坐标增量 /// public static Vector2 GetScreenDelta(List fingers) { var delta = Vector2.zero; TryGetScreenDelta(fingers, ref delta); return delta; } /// /// 获取手指平均的屏幕坐标增量 /// static bool TryGetScreenDelta(List fingers, ref Vector2 delta) { if (fingers != null) { var total = Vector2.zero; int count = 0; for (int i = fingers.Count - 1; i >= 0; i--) { var finger = fingers[i]; if (finger != null) { total += finger.ScreenDelta; count += 1; } } if (count > 0) { delta = total / count; return true; } } return false; } /// /// 获取所有手指平均世界坐标增量 /// public static Vector3 GetWorldDelta(float distance, Camera camera = null) { return GetWorldDelta(BFMain.Instance.TouchMgr.fingers, distance, camera); } /// /// 获取手指平均世界坐标增量 /// public static Vector3 GetWorldDelta(List fingers, float distance, Camera camera = null) { var delta = Vector3.zero; TryGetWorldDelta(fingers, distance, ref delta, camera); return delta; } /// /// 获取手指平均世界坐标增量 /// static bool TryGetWorldDelta(List fingers, float distance, ref Vector3 delta, Camera camera = null) { if (fingers != null) { var total = Vector3.zero; var count = 0; for (int i = fingers.Count - 1; i >= 0; i--) { var finger = fingers[i]; if (finger != null) { total += finger.GetWorldDelta(distance, camera); count += 1; } } if (count > 0) { delta = total / count; return true; } } return false; } /// /// 获取所有手指到手势中心的平均距离(屏幕坐标) /// public static float GetScreenDistance() { return GetScreenDistance(BFMain.Instance.TouchMgr.fingers); } /// /// 获取手指到手势中心的平均距离(屏幕坐标) /// public static float GetScreenDistance(List fingers) { var distance = 0f; var center = Vector2.zero; if (TryGetScreenCenter(fingers, ref center)) { TryGetScreenDistance(fingers, center, ref distance); } return distance; } /// /// 获取手指到center的平均距离(屏幕坐标) /// public static float GetScreenDistance(List fingers, Vector2 center) { var distance = 0f; TryGetScreenDistance(fingers, center, ref distance); return distance; } /// /// 获取手指到center的平均距离(屏幕坐标) /// static bool TryGetScreenDistance(List fingers, Vector2 center, ref float distance) { if (fingers != null) { var total = 0.0f; var count = 0; for (int i = fingers.Count - 1; i >= 0; i--) { var finger = fingers[i]; if (finger != null) { total += finger.GetScreenDistance(center); count += 1; } } if (count > 0) { distance = total / count; return true; } } return false; } /// /// 获取上一帧所有手指到手势中心的平均距离(屏幕坐标) /// public static float GetLastScreenDistance() { return GetLastScreenDistance(BFMain.Instance.TouchMgr.fingers); } /// /// 获取上一帧手指到手势中心的平均距离(屏幕坐标) /// public static float GetLastScreenDistance(List fingers) { var distance = 0.0f; var center = Vector2.zero; if (TryGetLastScreenCenter(fingers, ref center)) { TryGetLastScreenDistance(fingers, center, ref distance); } return distance; } /// /// 获取上一帧手指到center的平均距离(屏幕坐标) /// public static float GetLastScreenDistance(List fingers, Vector2 center) { float distance = 0.0f; TryGetLastScreenDistance(fingers, center, ref distance); return distance; } /// /// 获取上一帧手指到center的平均距离(屏幕坐标) /// static bool TryGetLastScreenDistance(List fingers, Vector2 center, ref float distance) { if (fingers != null) { var total = 0.0f; var count = 0; for (int i = fingers.Count - 1; i >= 0; i--) { var finger = fingers[i]; if (finger != null) { total += finger.GetLastScreenDistance(center); count += 1; } } if (count > 0) { distance = total / count; return true; } } return false; } /// /// 获取起始状态所有手指到手势中心的平均距离(屏幕坐标) /// public static float GetStartScreenDistance() { return GetStartScreenDistance(BFMain.Instance.TouchMgr.fingers); } /// /// 获取起始状态手指到手势中心的平均距离(屏幕坐标) /// public static float GetStartScreenDistance(List fingers) { var distance = 0f; var center = Vector2.zero; if (TryGetStartScreenCenter(fingers, ref center)) { TryGetStartScreenDistance(fingers, center, ref distance); } return distance; } /// /// 获取起始状态手指到center的平均距离(屏幕坐标) /// public static float GetStartScreenDistance(List fingers, Vector2 center) { var distance = 0f; TryGetStartScreenDistance(fingers, center, ref distance); return distance; } /// /// 获取起始状态手指到center的平均距离(屏幕坐标) /// static bool TryGetStartScreenDistance(List fingers, Vector2 center, ref float distance) { if (fingers != null) { var total = 0.0f; var count = 0; for (int i = fingers.Count - 1; i >= 0; i--) { var finger = fingers[i]; if (finger != null) { total += finger.GetStartScreenDistance(center); count += 1; } } if (count > 0) { distance = total / count; return true; } } return false; } /// /// 获取手势拉捏比例 /// /// 是否可以使用鼠标滚轮 public static float GetPinchScale(bool useWheel = false) { return GetPinchScale(BFMain.Instance.TouchMgr.fingers, useWheel); } /// /// 获取手势拉捏比例 /// /// 是否可以使用鼠标滚轮 public static float GetPinchScale(List fingers, bool useWheel = false) { var scale = 1.0f; var center = GetScreenCenter(fingers); var lastCenter = GetLastScreenCenter(fingers); TryGetPinchScale(fingers, center, lastCenter, ref scale, useWheel); return scale; } /// /// 获取手势拉捏比例 /// static bool TryGetPinchScale(List fingers, Vector2 center, Vector2 lastCenter, ref float scale, bool useWheel = false) { if (useWheel) { var scroll = Input.mouseScrollDelta.y; if (scroll > 0.0f) { scale = 1.0f - 0.1f; return true; } if (scroll < 0.0f) { scale = 1.0f + 0.1f; return true; } } var distance = GetScreenDistance(fingers, center); var lastDistance = GetLastScreenDistance(fingers, lastCenter); if (lastDistance > 0.0f) { scale = distance / lastDistance; return true; } return false; } /// /// 获取手势的扭曲度(单位为度) /// public static float GetTwistDegrees() { return GetTwistDegrees(BFMain.Instance.TouchMgr.fingers); } /// /// 获取手势的扭曲度(单位为度) /// public static float GetTwistDegrees(List fingers) { return GetTwistRadians(fingers) * Mathf.Rad2Deg; } /// /// 获取手势的扭曲度(单位为弧度) /// public static float GetTwistRadians() { return GetTwistRadians(BFMain.Instance.TouchMgr.fingers); } /// /// 获取手势的扭曲度(单位为弧度) /// public static float GetTwistRadians(List fingers) { var center = GetScreenCenter(fingers); var lastCenter = GetLastScreenCenter(fingers); var radians = 0.0f; TryGetTwistRadians(fingers, center, lastCenter, ref radians); return radians; } /// /// 获取手势的扭曲度(单位为弧度) /// static bool TryGetTwistRadians(List fingers, Vector2 center, Vector2 lastCenter, ref float radians) { if (fingers != null) { var total = 0.0f; var count = 0; for (int i = fingers.Count - 1; i >= 0; i--) { var finger = fingers[i]; if (finger != null) { total += finger.GetDeltaRadians(center, lastCenter); count += 1; } } if (count > 0) { radians = total / count; return true; } } return false; } } }