天天看點

[Unity3D插件]FingerGesture的簡單實用 效果圖 代碼(挂在Cube上)

當時的手機霸主諾基亞也曾輝煌過,但現在已經逐漸退出了人們的視線,因為它沒有跟上潮流,IT世界發展瞬息萬變,正因為它沒有迎合時代發展,是以就逐漸被淘汰。在諾基亞時代,手機都是按鍵式的,但自從出現了Android系統,各種智能機都如雨後春筍般湧出,往大螢幕,無按鍵的趨勢發展,是以各種手機應用隻能用虛拟的,比如虛拟按鈕,虛拟鍵盤,虛拟搖杆等等。繼續之前做的小龍遊戲的設計,然後就想到點選螢幕執行小龍飛躍的操作,然後就想到unity中FingerGesture插件。然後去搜尋這個插件的使用,自然而言就搜到了Momo的部落格,原來他老早就研究過了這個插件,我也就順便學習一下,寫一寫學習心得!

關于Fingergesture的使用Momo的建立步驟和代碼已經寫得很詳細了,關于插件的下載下傳,他部落格也寫得很清楚,我這兒就謝謝我的個人了解和學習的一個過程!

接下來先看效果圖,不要看就一個滑鼠按下的操作,可以分解成很多過程,滑鼠按下->滑鼠按住->滑鼠彈起,這很有當年開發單片機的感覺,有相似過程,單片機上的按鈕會出發0-1高低電頻,比如沒按住是高電平,按下是低電平,一直按住就一直處于低電平的狀态,然後LED燈管就能一直亮,然後再松開又回到高電平,LED燈滅,這電頻變化的一瞬間有一個觸發方式,邊沿觸發,呵呵,似乎是扯遠了,但其實原理有類似的地方!

[Unity3D插件]FingerGesture的簡單實用 效果圖 代碼(挂在Cube上)

提醒一下,我點選的左下角,看到螢幕的坐标原點其實是以左下角為原點的,這就是OpenGL坐标的原點規定!

[Unity3D插件]FingerGesture的簡單實用 效果圖 代碼(挂在Cube上)
[Unity3D插件]FingerGesture的簡單實用 效果圖 代碼(挂在Cube上)
[Unity3D插件]FingerGesture的簡單實用 效果圖 代碼(挂在Cube上)

滑動的分解過程:按下->按下事件開始->按下中->滑動開始->滑動中->滑動結束->判斷滑動方向

[Unity3D插件]FingerGesture的簡單實用 效果圖 代碼(挂在Cube上)

using UnityEngine;  

using System.Collections;  

publicclass FingerEvent :  MonoBehaviour {  

void OnEnable()  

   {  

//啟動時調用,這裡開始注冊手勢操作的事件。

//按下事件: OnFingerDown就是按下事件監聽的方法,這個名子可以由你來自定義。方法隻能在本類中監聽。下面所有的事件都一樣!!!

       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;  

   }  

void OnDisable()  

//關閉時調用,這裡銷毀手勢操作的事件

//和上面一樣

       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;  //長按

//按下時調用

void OnFingerDown( int fingerIndex, Vector2 fingerPos )  

//int fingerIndex 是手指的ID 第一按下的手指就是 0 第二個按下的手指就是1。。。一次類推。

//Vector2 fingerPos 手指按下螢幕中的2D坐标

//将2D坐标轉換成3D坐标

       transform.position = GetWorldPos( fingerPos );  

       Debug.Log(" 按下 = 坐标:"  +fingerPos);  

//擡起時調用

void OnFingerUp( int fingerIndex, Vector2 fingerPos, float timeHeldDown )  

       Debug.Log(" 擡起 = 坐标:"  +fingerPos  +"時間:"+timeHeldDown);  

//開始滑動

void OnFingerDragBegin( int fingerIndex, Vector2 fingerPos, Vector2 startPos )  

        Debug.Log("滑動開始 fingerIndex =" + fingerIndex  + " fingerPos ="+fingerPos +"startPos =" +startPos);  

//滑動結束

void OnFingerDragEnd( int fingerIndex, Vector2 fingerPos )  

       Debug.Log("滑動結束 fingerIndex =" + fingerIndex  + " fingerPos ="+fingerPos);  

//滑動中

void OnFingerDragMove( int fingerIndex, Vector2 fingerPos, Vector2 delta )  

          transform.position = GetWorldPos( fingerPos );  

           Debug.Log(" 滑動中 ="  +fingerPos);  

//上下左右四方方向滑動手勢操作

void OnFingerSwipe( int fingerIndex, Vector2 startPos, FingerGestures.SwipeDirection direction, float velocity )  

//結果是 Up Down Left Right 四個方向

       Debug.Log("滑動方向(Up/Down/Left/Right) :" + direction + " with finger " + fingerIndex);  

//連續按下事件, tapCount就是目前連續按下幾次

void OnFingerTap( int fingerIndex, Vector2 fingerPos, int tapCount )  

       Debug.Log("連續按下次數: " + tapCount + " ,fingerindex: " + fingerIndex);  

//按下事件開始後調用,包括 開始 結束 持續中狀态隻到下次事件開始!

void OnFingerStationaryBegin( int fingerIndex, Vector2 fingerPos )  

        Debug.Log("按下事件開始: " + fingerPos + " times with finger " + fingerIndex);  

void OnFingerStationary( int fingerIndex, Vector2 fingerPos, float elapsedTime )  

        Debug.Log("按下中: " + fingerPos + " times with finger " + fingerIndex);  

void OnFingerStationaryEnd( int fingerIndex, Vector2 fingerPos, float elapsedTime )  

        Debug.Log("按下結束:" + fingerPos + " times with finger " + fingerIndex);  

void OnFingerLongPress( int fingerIndex, Vector2 fingerPos )  

       Debug.Log("長按事件,位置: " + fingerPos + ",fingerIndex:"+fingerIndex );  

//把Unity螢幕坐标換算成3D坐标

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

}  

我們就通過F12來檢視FingerGestures插件方法實作的原理,就拿FingerGestures.OnFingerDown+= OnFingerDown;這行代碼來舉例子:

首先FingerGestures是一個類,作者自定義的一個手勢插件的類,真佩服能寫插件的人,這才是真大牛!還是先看一下幾個腳本的含義

[Unity3D插件]FingerGesture的簡單實用 效果圖 代碼(挂在Cube上)

嵌套定義得不可謂不複雜,呵呵!

FingerGestures.OnFingerDown,F12檢視一下這個OnFingerDown是一個啥東東,會發現

/// <summary>

/// Event fired when a finger's OnDown event fires

/// <seealso cref="Finger.OnDown"/>

/// </summary>

publicstaticevent FingerDownEventHandler OnFingerDown;  

這其實就是一個事件的申明,看英文注釋就知道是個Event,其實也看不出什麼,重點是在這個FingerDownEventHandler,繼續F12

/// Delegate for the OnFingerDown event

/// <param name="fingerIndex">0-based index uniquely indentifying a specific finger</param>

/// <param name="fingerPos">Current position of the finger on the screen</param>

publicdelegatevoid FingerDownEventHandler( int fingerIndex, Vector2 fingerPos );  

這是一個委托類型的聲明,兩個參數什麼意思寫的很明顯,不解釋!

然後來看一下OnFingerDown這個我們自己自定義的方法,這用+=連接配接起來,其實就是多點傳播委托的一種文法模式,一個委托能夠執行多個方法,就像小明媽媽委托小明先去買菜,這是一個方法吧,然後買完菜去洗菜,然後做菜等等就是這種+=的形象解釋。

當然結束的時候要将方法給-=掉,不然小明會生氣了,心中不滿,媽媽你總是老叫我做個不停呀,哈哈!這就是OnDisable()中為什麼要-=的一個解釋!

事件指向自己自定義的方法,但前提是參數必須要一樣,就是你所委托的這個人要能完成你的事情,打個形象的比喻,你不能叫一個剛出生的小孩去打醬油吧,呵呵,就是這個道理!這下你感覺對委托和事件是一個什麼關系應該更加深刻了吧!

本文轉蓬萊仙羽 51CTO部落格,原文連結:http://blog.51cto.com/dingxiaowei/1372109,如需轉載請自行聯系原作者