fingerGgesture
? ? ? ? ? 最近研究了一下Unity中的一個(gè)手勢操作的插件FingerGestures。它能很方便監(jiān)聽到Unity中的各種手勢事件:上下左右四方向的滑動(dòng)事件、按下事件、抬起事件、移動(dòng)事件、連擊事件、長按事件等等。它同時(shí)支持觸摸屏操作與鼠標(biāo)操作,總起來說使用起來還是比較方便的,今天寫下教程記錄這個(gè)插件的詳細(xì)使用步驟。首先下載這個(gè)插件,大家可以在圣典上找這個(gè)插件的下載地址,當(dāng)然也可以在本文最后下載該插件。
?我看了一下這個(gè)插件底層的實(shí)現(xiàn)步驟,他是通過C#代理的形式來實(shí)現(xiàn)手勢操作的。如下圖紅圈內(nèi)所示,這五個(gè)重要的預(yù)設(shè)用來監(jiān)聽觸摸與鼠標(biāo)的手勢事件。包括:單手觸摸事件、雙手觸摸事件、鼠標(biāo)事件、觸摸事件。這里我們使用一個(gè)單手的事件,如圖中所示將Finger Gertures Initializer拖拽入左側(cè)層次視圖中。
?
OK,上面我們說了該插件是通過C#代理形式來接收事件消息的,所以我們需要用腳本來注冊這些事件從而開始接收消息。接著創(chuàng)建一個(gè)立方體對象用以處理手勢操作,當(dāng)然你也可以處理游戲中的任何對象。編寫腳本FingerEvent.cs ,把這個(gè)腳本掛在這個(gè)立方體對象之上。
FingerEvent.cs腳本?
using UnityEngine; using System.Collections;
public class FingerEvent :? MonoBehaviour {
??? void OnEnable() ??? { ??? ?//啟動(dòng)時(shí)調(diào)用,這里開始注冊手勢操作的事件。
??? ?//按下事件: OnFingerDown就是按下事件監(jiān)聽的方法,這個(gè)名子可以由你來自定義。方法只能在本類中監(jiān)聽。下面所有的事件都一樣!!! ??????? FingerGestures.OnFingerDown += OnFingerDown; ??????? //抬起事件 ??FingerGestures.OnFingerUp += OnFingerUp; ???? //開始拖動(dòng)事件 ???? FingerGestures.OnFingerDragBegin += OnFingerDragBegin; ??????? //拖動(dòng)中事件... ??????? FingerGestures.OnFingerDragMove += OnFingerDragMove; ??????? //拖動(dòng)結(jié)束事件 ??????? FingerGestures.OnFingerDragEnd += OnFingerDragEnd; ??//上、下、左、右、四個(gè)方向的手勢滑動(dòng) ??FingerGestures.OnFingerSwipe += OnFingerSwipe; ??//連擊事件 連續(xù)點(diǎn)擊事件 ??FingerGestures.OnFingerTap += OnFingerTap; ??//手指觸摸屏幕中事件調(diào)用一下三個(gè)方法 ??FingerGestures.OnFingerStationaryBegin += OnFingerStationaryBegin; ??FingerGestures.OnFingerStationary += OnFingerStationary; ??FingerGestures.OnFingerStationaryEnd += OnFingerStationaryEnd; ??//長按事件 ??FingerGestures.OnFingerLongPress += OnFingerLongPress;
??? }
??? void OnDisable() ??? { ??? ?//關(guān)閉時(shí)調(diào)用,這里銷毀手勢操作的事件 ??? ?//和上面一樣 ??????? FingerGestures.OnFingerDown -= OnFingerDown; ??FingerGestures.OnFingerUp -= OnFingerUp; ??FingerGestures.OnFingerDragBegin -= OnFingerDragBegin; ??????? FingerGestures.OnFingerDragMove -= OnFingerDragMove; ??????? FingerGestures.OnFingerDragEnd -= OnFingerDragEnd; ??FingerGestures.OnFingerSwipe -= OnFingerSwipe; ??FingerGestures.OnFingerTap -= OnFingerTap; ??FingerGestures.OnFingerStationaryBegin -= OnFingerStationaryBegin; ??FingerGestures.OnFingerStationary -= OnFingerStationary; ??FingerGestures.OnFingerStationaryEnd -= OnFingerStationaryEnd; ??FingerGestures.OnFingerLongPress -= OnFingerLongPress; ??? }
??? //按下時(shí)調(diào)用 ??? void OnFingerDown( int fingerIndex, Vector2 fingerPos ) ??? { ??//int fingerIndex 是手指的ID 第一按下的手指就是 0 第二個(gè)按下的手指就是1。。。一次類推。 ??//Vector2 fingerPos 手指按下屏幕中的2D坐標(biāo)
??//將2D坐標(biāo)轉(zhuǎn)換成3D坐標(biāo) ??????? transform.position = GetWorldPos( fingerPos ); ??Debug.Log(" OnFingerDown ="? +fingerPos); ??? }
?//抬起時(shí)調(diào)用 ?void OnFingerUp( int fingerIndex, Vector2 fingerPos, float timeHeldDown ) ?{
??Debug.Log(" OnFingerUp ="? +fingerPos); ?}
?//開始滑動(dòng) ?void OnFingerDragBegin( int fingerIndex, Vector2 fingerPos, Vector2 startPos ) ??? { ?? ? ? Debug.Log("OnFingerDragBegin fingerIndex =" + fingerIndex? + " fingerPos ="+fingerPos +"startPos =" +startPos); ??? } ?//滑動(dòng)結(jié)束 ?void OnFingerDragEnd( int fingerIndex, Vector2 fingerPos ) ?{
? ?Debug.Log("OnFingerDragEnd fingerIndex =" + fingerIndex? + " fingerPos ="+fingerPos); ?} ?//滑動(dòng)中 ??? void OnFingerDragMove( int fingerIndex, Vector2 fingerPos, Vector2 delta ) ??? { ?????????? transform.position = GetWorldPos( fingerPos ); ???Debug.Log(" OnFingerDragMove ="? +fingerPos);
??? } ?//上下左右四方方向滑動(dòng)手勢操作 ?void OnFingerSwipe( int fingerIndex, Vector2 startPos, FingerGestures.SwipeDirection direction, float velocity ) ??? { ??//結(jié)果是 Up Down Left Right 四個(gè)方向 ??Debug.Log("OnFingerSwipe " + direction + " with finger " + fingerIndex);
??? }
?//連續(xù)按下事件, tapCount就是當(dāng)前連續(xù)按下幾次 ?void OnFingerTap( int fingerIndex, Vector2 fingerPos, int tapCount ) ??? {
??????? Debug.Log("OnFingerTap " + tapCount + " times with finger " + fingerIndex);
??? }
?//按下事件開始后調(diào)用,包括 開始 結(jié)束 持續(xù)中狀態(tài)只到下次事件開始! ???????? //OnFingerStationary 事件和? OnFingerDragMove 有一個(gè)區(qū)別。 ???????? //OnFingerStationary 是手指觸摸在屏幕中的事件,而OnFingerDragMove是先觸摸一下然后滑動(dòng)的事件。 ???????? //如果你需要時(shí)時(shí)捕獲手指觸摸屏幕中的事件時(shí) 用OnFingerStationary 即可 ?void OnFingerStationaryBegin( int fingerIndex, Vector2 fingerPos ) ?{
?? Debug.Log("OnFingerStationaryBegin " + fingerPos + " times with finger " + fingerIndex); ?}
?void OnFingerStationary( int fingerIndex, Vector2 fingerPos, float elapsedTime ) ?{
?? Debug.Log("OnFingerStationary " + fingerPos + " times with finger " + fingerIndex);
?}
?void OnFingerStationaryEnd( int fingerIndex, Vector2 fingerPos, float elapsedTime ) ?{
?? Debug.Log("OnFingerStationaryEnd " + fingerPos + " times with finger " + fingerIndex); ?}
?//長按事件 ?void OnFingerLongPress( int fingerIndex, Vector2 fingerPos ) ?{
??Debug.Log("OnFingerLongPress " + fingerPos ); ?}
?//把Unity屏幕坐標(biāo)換算成3D坐標(biāo) ??? Vector3 GetWorldPos( Vector2 screenPos ) ??? { ??????? Camera mainCamera = Camera.main; ??????? return mainCamera.ScreenToWorldPoint( new Vector3( screenPos.x, screenPos.y, Mathf.Abs( transform.position.z - mainCamera.transform.position.z ) ) ); ??? } }
如下圖所示,用鼠標(biāo)還是IOS Android觸摸事件都能很好的在這個(gè)Cube上響應(yīng),大家把我的代碼手動(dòng)的打一遍就什么都明白了。
?
?
? ? ? ? 上面的腳本,我們是直接綁定在立方體對象上來監(jiān)聽它,如果你想在別的腳本監(jiān)聽這個(gè)立方體對象的手勢操作。只需調(diào)用如下方法即可。這個(gè)方法官方封裝在了SampleBase中。因?yàn)楣俜降睦映绦蚰_本是繼承它的,所以子類就可以直接使用父類的方法??墒荢ampleBase會(huì)自動(dòng)初始化一個(gè)SampleUI的腳本,不想初始化這個(gè)腳本的話直接用下面方法就行,原理就是通過射線我就不過多的解釋了。傳遞鼠標(biāo)或觸摸的2D坐標(biāo)即可得到觸摸的3D模型對象。
// Return the GameObject at the given screen position, or null if no valid object was found public static GameObject PickObject( Vector2 screenPos ) { ??? Ray ray = Camera.main.ScreenPointToRay( screenPos ); ??? RaycastHit hit;
??? if( Physics.Raycast( ray, out hit ) ) ??????? return hit.collider.gameObject;
??? return null; }
最后大家仔細(xì)看一下官方的FingerGestures.cs腳本,所有的手勢操作的事件都在這里,包括單手操作事件、雙手操作事件、鼠標(biāo)操作事件。
插件以及源碼下載地址:http://vdisk.weibo.com/s/ifRgG
總結(jié)
以上是生活随笔為你收集整理的fingerGgesture的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++入门之cin cout
- 下一篇: 深受震撼....