关于移动端触屏输入控制的API的使用汇总(二)_Unity 单指与双指Touch事件捕获(网友项目使用总结)
原文出处http://blog.csdn.net/reipeng/article/details/50960178
using UnityEngine;
using System.Collections;
using UnityEngine.EventSystems;
public delegate void TouchEventHandler(TouchEventArgs args);
public class TouchManager : MonoBehaviour
{
public static TouchManager instance;
private static bool isInited = false;
public static bool IsInited()
{
return (null != instance && isInited);
}
public static TouchManager GetInstance()
{
return instance;
}
public event TouchEventHandler onFirstTouchBegan;
public event TouchEventHandler onFirstTouchMoved;
public event TouchEventHandler onFirstTouchEnded;
public event TouchEventHandler onTwoTouchMoved;
private Vector2 touchStartPos;
private bool getTwoTouch;
private float disBtwTouch;
private bool isMouseDown;
public void Start()
{
onFirstTouchBegan = new TouchEventHandler(InitFirstBeganHandler);
onFirstTouchMoved = new TouchEventHandler(InitFirstMovedHandler);
onFirstTouchEnded = new TouchEventHandler(InitFirstEndedHandler);
onTwoTouchMoved = new TouchEventHandler(InitTwoMovedHandler);
touchStartPos = Vector2.zero;
getTwoTouch = false;
isMouseDown = false;
instance = this;
isInited = true;
}
private void InitFirstBeganHandler(TouchEventArgs args)
{
//Debug.Log("InitFirstBeganHandler " + args.ToString());
}
private void InitFirstMovedHandler(TouchEventArgs args)
{
//Debug.Log("InitFirstMovedHandler " + args.ToString());
}
private void InitFirstEndedHandler(TouchEventArgs args)
{
//Debug.Log("InitFirstEndedHandler " + args.ToString());
}
private void InitTwoMovedHandler(TouchEventArgs args)
{
//Debug.Log("InitTwoMovedHandler " + args.ToString());
}
void Update()
{
if (Application.platform == RuntimePlatform.Android || Application.platform == RuntimePlatform.IPhonePlayer)
{
GetTouchEvent();
}
else
{
GetMouseEvent();
}
}
private void GetTouchEvent()
{
if (Input.touchCount == 0)
{
getTwoTouch = false;
return;
}
if (EventSystem.current.IsPointerOverGameObject(Input.GetTouch(0).fingerId))
{
getTwoTouch = false;
return;
}
if (Input.touchCount == 1)
{
Touch firstTouch = Input.GetTouch(0);
if (firstTouch.phase == TouchPhase.Began)
{
touchStartPos = firstTouch.position;
onFirstTouchBegan(new TouchEventArgs(touchStartPos, 0));
return;
}
if (firstTouch.phase == TouchPhase.Moved)
{
if (getTwoTouch) return;
Vector2 deltaMv = firstTouch.position - touchStartPos;
onFirstTouchMoved(new TouchEventArgs(touchStartPos, 0));
touchStartPos = firstTouch.position;
return;
}
if (firstTouch.phase == TouchPhase.Ended)
{
if (getTwoTouch) return;
onFirstTouchEnded(new TouchEventArgs(touchStartPos, 0));
return;
}
return;
}
else if (Input.touchCount == 2)
{
Touch firstTouch = Input.GetTouch(0);
Touch secondTouch = Input.GetTouch(1);
float curDis = UnityHelper.GetGenScreenDis(firstTouch.position, secondTouch.position);
if (IsTouchDown(firstTouch) || IsTouchDown(secondTouch))
{
if (!getTwoTouch)
{
getTwoTouch = true;
disBtwTouch = curDis;
return;
}
float deltaDis = curDis - disBtwTouch;
onTwoTouchMoved(new TouchEventArgs(Vector2.zero, deltaDis));
disBtwTouch = curDis;
return;
}
getTwoTouch = true;
return;
}
}
private bool IsTouchDown(Touch touch)
{
return (touch.phase == TouchPhase.Stationary || touch.phase == TouchPhase.Moved);
}
private void GetMouseEvent()
{
if (EventSystem.current.IsPointerOverGameObject())
{
return;
}
float wheelValue = Input.GetAxis("Mouse ScrollWheel");
if (wheelValue != 0)
{
onTwoTouchMoved(new TouchEventArgs(Vector2.zero, wheelValue));
}
if (Input.GetMouseButtonDown(0))
{
touchStartPos = Input.mousePosition;
onFirstTouchBegan(new TouchEventArgs(touchStartPos, 0));
isMouseDown = true;
return;
}
if (Input.GetMouseButtonUp(0))
{
touchStartPos = Input.mousePosition;
onFirstTouchEnded(new TouchEventArgs(touchStartPos, 0));
isMouseDown = false;
return;
}
if(Input.GetMouseButton(0))
{
if (!isMouseDown) { return; }
Vector2 deltaMv = ((Vector2)Input.mousePosition) - touchStartPos;
if (Vector2.zero == deltaMv) { return; }
onFirstTouchMoved(new TouchEventArgs(touchStartPos, 0));
touchStartPos = Input.mousePosition;
return;
}
}
}
public class TouchEventArgs : System.EventArgs
{
public Vector2 touchedPos;
public float twoMvDis;
public TouchEventArgs(Vector2 pos, float mvDis)
{
touchedPos = UnityHelper.GetGenScreenPos(pos);
twoMvDis = mvDis;
}
public override string ToString()
{
return string.Format("touchedPos: {0}\t twoMvDis: {1}", touchedPos, twoMvDis);
}
}
public class UnityHelper
{
/// <summary>
/// 获取通用的屏幕坐标,即忽略dpi的坐标
/// </summary>
public static Vector2 GetGenScreenPos(Vector2 originPos)
{
Vector2 result = originPos;
result.x /= (1.000f * Screen.width);
result.y /= (1.000f * Screen.height);
return result;
}
/// <summary>
/// 根据通用屏幕坐标计算出当前的实际屏幕坐标
/// </summary>
/// <param name="genPos"></param>
/// <returns></returns>
public static Vector2 GetScreenPosFromGen(Vector2 genPos)
{
Vector2 result = genPos;
result.x *= Screen.width;
result.y *= Screen.height;
return result;
}
/// <summary>
/// 计算通用的屏幕距离,即可以忽略dpi的规范距离
/// </summary>
/// <param name="pos1"></param>
/// <param name="pos2"></param>
/// <returns></returns>
public static float GetGenScreenDis(Vector2 pos1, Vector2 pos2)
{
return Vector2.Distance(GetGenScreenPos(pos1), GetGenScreenPos(pos2));
}
}
使用方法,在保证TouchManager初始化完全的情况下,调用:
TouchManager.GetInstance().onTwoTouchMoved += OnDoubleTouchMoved;
添加两指相对运动的事件响应逻辑。
不需要响应了,则调用:
TouchManager.GetInstance().onTwoTouchMoved -= OnDoubleTouchMoved;
就可以了。 附上OnDoubleTouchMoved函数原型:
private void OnDoubleTouchMoved(TouchEventArgs args)
{
Debug.Log("OnDoubleTouchMoved :" + args.ToString() );
}