當時的手機霸主諾基亞也曾輝煌過,但現在已經逐漸退出了人們的視線,因為它沒有跟上潮流,IT世界發展瞬息萬變,正因為它沒有迎合時代發展,是以就逐漸被淘汰。在諾基亞時代,手機都是按鍵式的,但自從出現了Android系統,各種智能機都如雨後春筍般湧出,往大螢幕,無按鍵的趨勢發展,是以各種手機應用隻能用虛拟的,比如虛拟按鈕,虛拟鍵盤,虛拟搖杆等等。繼續之前做的小龍遊戲的設計,然後就想到點選螢幕執行小龍飛躍的操作,然後就想到unity中FingerGesture插件。然後去搜尋這個插件的使用,自然而言就搜到了Momo的部落格,原來他老早就研究過了這個插件,我也就順便學習一下,寫一寫學習心得!
關于Fingergesture的使用Momo的建立步驟和代碼已經寫得很詳細了,關于插件的下載下傳,他部落格也寫得很清楚,我這兒就謝謝我的個人了解和學習的一個過程!
接下來先看效果圖,不要看就一個滑鼠按下的操作,可以分解成很多過程,滑鼠按下->滑鼠按住->滑鼠彈起,這很有當年開發單片機的感覺,有相似過程,單片機上的按鈕會出發0-1高低電頻,比如沒按住是高電平,按下是低電平,一直按住就一直處于低電平的狀态,然後LED燈管就能一直亮,然後再松開又回到高電平,LED燈滅,這電頻變化的一瞬間有一個觸發方式,邊沿觸發,呵呵,似乎是扯遠了,但其實原理有類似的地方!
提醒一下,我點選的左下角,看到螢幕的坐标原點其實是以左下角為原點的,這就是OpenGL坐标的原點規定!
滑動的分解過程:按下->按下事件開始->按下中->滑動開始->滑動中->滑動結束->判斷滑動方向
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是一個類,作者自定義的一個手勢插件的類,真佩服能寫插件的人,這才是真大牛!還是先看一下幾個腳本的含義
嵌套定義得不可謂不複雜,呵呵!
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,如需轉載請自行聯系原作者