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;
}
}
}