夾
fingerGestures包結構
路徑。相對Assets/Plugin/…
描寫叙述
FingerGestures/
插件的根檔案夾
FingerGestures/Prefabs
能夠直接拖放到場景中的預設資源(prefabs)
FingerGestures/Scripts
核心腳本群組件
FingerGestures/Scripts/Gesture Recognizers
每一個手勢識别 的腳本
FingerGestures/Scripts/Finger Event Detectors
每一個觸摸事件檢測器的腳本
FingerGestures/Scripts/Components
手勢識别和觸摸事件所須要加入的額外元件
FingerGestures/Toolbox
FingerGestures 自帶的工具箱腳本
FingerGestures/Samples.unitypackage
全部樣例的子包
FingerGestures/PlayMaker Actions.unitypackage
FingerGestures對PlayMaker擴充的插件
Editor/FingerGestures
FingerGestures對編輯器的擴充
FingerGestures樣例清單
Finger Event(滑鼠或手指事件)
FingerEventsPart1: 展示怎樣通過不同的檢測器( FingerEventDetectors )去檢測滑鼠或者手指的上(down)、下(up),按下不移動(stationary。懸停(hover) 事件。
FingerEventsPart2: 展示怎樣識别不同滑鼠或者手指動作(FingerMotionDetector)。
Gestures(手勢)
BasicGestures: 識别單擊(react to tap),輕按兩下(double tap),拖動(drag)。長按(long——press),滑動(swipe)等基礎手勢。
PinchAndTwist: 兩個或多個手指同一時候在觸摸屏上擠壓(pinch)或扭轉(twist)時,觸發手勢的事件。
(PS:通常都是用來縮放或旋轉)
PointCloudGestures: 示範怎樣識别一個點雲(point cloud)手勢。(PS:一般是指用使用者畫的圖案作為識别)
Toolbox(工具箱)
Camera(放入錄影機的腳本):
Toolbox-DragView: 展示使用TBDragView腳本,實作拖動視角。
Toolbox-Orbit: 展示使用TBOrbit腳本,實作環繞目标旋轉視角。
Toolbox-Pan: 展示使用TBPan腳本,實作以自身為軸旋轉視角。
Toolbox-PinchZoom: 展示使用TBPinchZoom腳本。實作變焦。
Object-Based(放入普通場景對象的腳本):
Toolbox-Drag: 展示使用TBDrag腳本,實作簡單的物體拖動
Toolbox-Hover: 展示使用TBHoverChangeMaterial 和 TBHoverChangeScale腳本,實作當滑鼠或者手指懸停在物體上時候的響應。(PS:類似滑鼠放到圖示上,圖示發亮的效果)
Toolbox-PinchToScale 展示使用TBPinchToScale腳本。實作縮放物體
Toolbox-TwistToRotate: 展示使用TBTwistToRotate腳本,實作旋轉物體
設定場景
須要在場景中執行個體化一個FingerGesture元件才可使用。 FingerGesture在項目中的作用是管理使用者輸入和識别手勢和滑鼠或手指事件。
有兩種加入方式。一是直接把Plugins\FingerGestures\Prefabs下的FingerGestures prefab檔案拖入場景中。二是能夠建立一個空物件,然後把FingerGestures元件加入進去。
使用Make Persistent标志能夠讓使FingerGestures 單例在跨場景後一直有效,是以僅僅要保證它在第一個場景設定就足夠。
教程:識别一個輕敲手勢
該章節會學習到怎樣識别一個簡單的單擊動作。然後到特殊物件的單擊動作識别,最後到識别一個三個手指的輕按兩下動作。
初始化
第一步。如上章節設定;
第二步。建立一個GameObject 命名為Gestures ;
第三步,給Gestures加入一個TapRecognizer元件。并保持預設設定,你能夠在項目面闆搜尋到它或者直接打開Component > FingerGestures > Gestures > Tap menu item。
TapRecognizer 是當中一種手勢識别器。它用于監控使用者輸入并且當一個有效的單擊動作被識别時候工作。
第四步,建立一個新的C# script 叫做 TapTutorial并加入到第二步建立的Gestures中。
輕敲螢幕
第一步。點選TapGestures元件上的Copy Event To Clipboardbutton,它會把TapGesture所須要的時間信号代碼copy到黏貼闆。
第二步,粘貼到TapTutorial腳本裡,例如以下:
public class TapTutorial : MonoBehaviour
{
void OnTap( TapGesture gesture )
{
}
}
OnTap函數比對定義在TapRecognizer 元件内的資訊名屬性,當識别器要識别一個輕敲手勢,它會使用unity3d的SendMessage API先向Gestures物件内全部的腳本廣播OnTap資訊,僅僅要TapTutorial綁定在該物件上,它的OnTap函數就會被調用到。
出于性能考慮,通常使用.net标準的事件模型取代unity3d的SendMessage API。
第三步,改動OnTop函數:
void OnTap( TapGesture gesture )
{
Debug.Log( "Tap gesture detected at " + gesture.Position +
". It was sent by " + gesture.Recognizer.name );
}
gesture參數包括着手勢事件資料。在上面的代碼,我們主要輸出了位置和TapRecognizer内工作的事件。你還能夠在gesture參數内獲得很多其它屬性,比如通過gesture.Fingers獲得滑鼠或手指相關的手勢清單。還有能夠通過gesture.Selection獲得目前是哪個場景被輕敲 。
第四步。能夠測試,通過敲不同位置。能夠看到debug資訊輸出。
教程:手勢識别器
在FingerGesture裡,使用者的手勢都由GestureRecognizers元件來處理,它是順序處理被識别比對的使用者動作的。
找到GestureRecognizers
每種手勢都有自己的腳本,存放腳本的路徑在Plugins\FingerGestures\Scripts\Gesture Recognizers 。
你也能夠從 Component > FingerGestures > Gestures menu裡面找到。
基本使用
要識别一個特殊手勢。你須要:
1、加入相應的GestureRecognizer元件到場景中的目标物件。
2、配置它的屬性。
3、監聽它的手勢事件和相應響應。
作為手勢事件通知的一部分,GestureRecognizer傳遞一個包括相關資訊(位置。手指觸屏點清單。選擇的場景物件,相關的GestureRecognizer等)的事件參數。
一個手勢識别器有下面監聽事件的方式:
1、使用标準的.net 托付事件模型,每個手勢識别器都暴露一個.net事件接口。
2、使用unity的SendMessage()函數 :
手勢事件将會被廣播到遊戲對象裡全部的元件。
手勢事件也能夠指向目前相關的場景對象。這時候須要把手勢識别器配置到 `Raycaster `元件中才幹檢測場景對象。
這取決于你的選擇。.net的事件模型較為高效,unity的SendMessage()較為友善。
屬性
由同一基類派生出來的各種手勢識别器共用一個通用配置和一些函數。
比如,我們能夠看到TapRecognizer和SwipeRecognizer元件的配置放置在同一個對象裡。
設定:
你能夠看到。兩個元件共用了一部配置設定置:fingers setup,reset mode,event notification settings,references to additional components...
相同。每一個手勢識别器都有自己獨特的配置。比如滑動識别器要設定距離閥值、速度、和偏差。而多點觸控能夠設定最大持續時間等。
事件資訊廣播:
此處使用SendMessage()函數去通知其它系統。你能夠使用Message Name屬性去指定響應的函數名。
通常,Message Target會設定你增加的手勢識别器元件。但你也能夠設定别的對象。
元件:
你能夠收到手動指定加入元件。比如:加入一個ScreenRaycaster元件讓手勢識别器獲知場景内對象碰撞。
并把消息發送到對應的監聽器。它同意識别器轉發消息到正在有關聯的場景對象。
教程:輕擊手勢識别器
屬性
Required Taps :連續輕擊的次數。
Max Delay Between Taps :兩次輕擊間最大的時間間隔。(秒)
Movement Tolerance:連續輕敲時候。和第一次輕擊的位置相隔的偏差大小。
Max Duration:最大能夠識别的手指數。
事件
void OnTap( TapGesture gesture )
{
// 輕擊的數量
int taps = gesture.Taps;
}
教程:拖拽手勢識别器
屬性
Movement Tolerance:最小的拖動距離才觸發識别器。
Apply Same Direction Constraint:僅僅能用于多點拖拽。打開後。假設全部點不是向同一個方向拖拽。識别器将不會識别。
事件
void OnDrag( DragGesture gesture )
{
// 目前識别器階段 (Started/Updated/Ended)
ContinuousGesturePhase phase = gesture.Phase;
// 最後一幀的拖拽/移動資料
Vector2 deltaMove = gesture.DeltaMove;
//完整的拖拽資料
Vector2 totalMove = gesture.TotalMove;
}
教程:滑動手勢識别器
屬性
Min Distance: 必須滑動的最小距離。
Max Distance:同意滑動的最大距離。
Min Velocity:滑動時候最小速度。
Max Deviation:同意的最大角度偏差。(度)
事件
void OnSwipe( SwipeGesture gesture )
{
// 完整的滑動資料
Vector2 move = gesture.Move;
// 滑動的速度
float velocity = gesture.Velocity;
// 大概的滑動方向
FingerGestures.SwipeDirection direction = gesture.Direction;
}
教程:長按手勢識别器
屬性
Press Duration:最少長按時間。
Move Tolerance:長按過程中同意的最大移動偏差。
事件
void OnLongPress( LongPressGesture gesture )
{
// 長按持續時間
float elapsed = gesture.ElapsedTime;
}
教程:縮放手勢識别器
屬性
Minimum DOT :同意的小向量點積。
Minimum Distance:兩個手指第一次觸屏時候同意的最短路徑。
事件
void OnPinch( PinchGesture gesture )
{
// 識别器目前狀态(Started/Updated/Ended)
ContinuousGesturePhase phase = gesture.Phase;
// 目前兩個手指的距離
float gap = gesture.Gap;
// 目前與上一幀的變動值
float delta = gesture.Delta;
}
教程:旋轉手勢識别器
屬性
Minimum DOT :同意的小向量點積。
Minimum Rotation:必須的最小自旋角度。
事件
void OnTwist( TwistGesture gesture )
{
// 識别器目前狀态 (Started/Updated/Ended)
ContinuousGesturePhase phase = gesture.Phase;
// 近期一次角度變化(度)
float delta = gesture.DeltaRotation;
// 總的角度變化(度)
float total = gesture.TotalRotation;
}
桌面仿真
在桌面環境。你能夠通過left-CTRL鍵加上滑鼠轉輪去調節角度。也能夠在Mouse Input Provider配置别的按鍵。
教程:自己定義手勢識别器
自從FingerGestures 3.0之後。能夠通過PointCloudRecognizer識别自己定義手勢。利用基于$P recognizer 是手勢比對算法實作。
如今僅僅支援單手指操作的識别。将來會支援多點自己定義手勢。
點雲識别器會對照使用者輸入和已經設定好的手勢模闆。然後會傳回近期接近的比對結果,會傳回比對得分和差距值。
點雲識别器是規模和方向固定不變的,這就意味着它能夠識别畫得比較大或者小的,也或者是反方向的(李若:從左到右變成從右到左)。
點雲識别器模闆
一個模闆包含要識别的手勢的資料。是通過一個編輯器編輯的。
建立一個模闆須要下面步驟:
1:在你的項目編碼,右擊-> create ->PonitCloud Gesture Template
一個新的模闆就好加入到項目裡面。能夠自己重命名。
2:選擇模闆然後在 Inspecrot 面闆内點選 Edit。
3:然後開始繪圖案。
使用點雲識别器
第一步:
1:保證場景對象已經設定好了finger gesture的屬性。
2:建立一個新的Gestures對象。
3:加入一個PointCloudRecognizer元件。
下面屬性須要特别注意。
Max Match Distance:控制識别的精确的程度。
數值越低,越精确。
Sampling Distance: 連貫動作取樣時候,兩點間隔的最小距離。越小越精确,可是取樣會很多其它。
Gesture Templates List:我們指定的模闆清單。
第二步:
加入剛剛建立的模闆拖放到手勢模闆清單中。
第三步:
1、建立一個c#檔案,此處命名為PointCloudTutorial.cs。
2、在PointCloudRecognizer 以下建立一個手勢對象。
3、編輯c#檔案:
public class PointCloudTutorial : MonoBehaviour
{
void OnCustomGesture( PointCloudGesture gesture )
{
Debug.Log( "Recognized custom gesture: " + gesture.RecognizedTemplate.name +
", match score: " + gesture.MatchScore +
", match distance: " + gesture.MatchDistance );
}
}
手勢事件保護以下幾個重要屬性:
gesture.RecognizedTemplate: 被覺得是最佳比對的手勢模闆。
gesture.MatchScore:一個百分比的值,表示比對的程度。
gesture.MatchDistance:一個測量絕對值,表示比對程度。
你還能夠使用其它手勢的屬性。
比如位置和選擇對象等屬性。
用代碼建立模闆
你能夠使用api字自己的編輯器擴充中在執行時候建立手勢模闆。
void Awake()
{
PointCloudGestureTemplate triangle = ScriptableObject.CreateInstance();
triangle.name = "Triangle Gesture Template";
triangle.BeginPoints();
triangle.AddPoint( 0, 1, 1 );
triangle.AddPoint( 0, 2, 2 );
triangle.AddPoint( 0, 3, 1 );
triangle.AddPoint( 0, 1, 1 );
triangle.EndPoints();
PointCloudGestureTemplate square = ScriptableObject.CreateInstance();
square.name = "Square Gesture Template";
square.BeginPoints();
square.AddPoint( 0, 2, 1 );
square.AddPoint( 0, 2, 3 );
square.AddPoint( 0, 4, 3 );
square.AddPoint( 0, 4, 1 );
square.AddPoint( 0, 2, 1 );
square.EndPoints();
PointCloudRegognizer recognizer = gameObject.AddComponent();
recognizer.AddTemplate( triangle );
recognizer.AddTemplate( square );
}
第一個參數AddPoint是一個筆畫的順序。該api臨時僅僅支援單線筆畫的手勢。
當EndPoints()調用時候。手勢模闆會被格式化,全部的點都會又一次繪制成0到1範圍的數。
教程:識别手指事件
FingerGestures 能夠識别向上,向下,懸停,移動,長按等單點輸入手勢。各種FingerEventDetector元件用于識别相應的手指事件,與 GestureRecognizers類似,都是通過廣播資訊去觸發。
FingerEventDetector
全部的手指事件識别器都派生與一個基礎抽象類。通常。每一個FingerEventDetector執行個體監控着全部手指事件信号。
也能夠配置Finger Index Filter屬性。讓其僅僅跟蹤特定的手指事件。
和手勢識别器一樣。手指事件識别器傳遞一個事件資料對象,改該對象派生于FingerEvent類。包括下面屬性:
屬性
類型
描寫叙述
Name
string
消息的名字
Detector
FingerEventDetector
該次事件中的手指事件識别器
Finger
FingerGestures.Finger
該次事件中的手指類
Position
Vector2
事件所發生的位置
Selection
GameObject
被選中遊戲對象 (依賴`ScreenRaycaster `元件)
Hit/td>
RaycastHit
光線投射碰撞,由`ScreenRaycaster`提供,在正常顯示上很實用
FingerUpDetector
void OnFingerUp( FingerUpEvent e )
{
//手指已經持續的時間
float elapsedTime = e.TimeHeldDown;
}
FingerHoverDetector
void OnFingerHover( FingerHoverEvent e )
{
// 檢查狀态,是進入還是離開.
if( e.Phase == FingerHoverPhase.Enter )
{
Debug.Log( e.Finger + " entered object: " + e.Selection );
}
else if( e.Phase == FingerHoverPhase.Exit )
{
Debug.Log( e.Finger + " exited object: " + e.Selection );
}
}
FingerMotionDetector
該識别器可以識别兩種事件。
1、OnFingerMove :當手指位置距離上一幀位置有發生變化。
2、OnFingerStationary :當手指與上一幀位置一樣。
void OnFingerMove( FingerMotionEvent e )
{
float elapsed = e.ElapsedTime;
if( e.Phase == FingerMotionPhase.Started )
Debug.Log( e.Finger + " started moving at " + e.Position);
else if( e.Phase == FingerMotionPhase.Updated )
Debug.Log( e.Finger + " moving at " + e.Position );
else if( e.Phase == FingerMotionPhase.Ended )
Debug.Log( e.Finger + " stopped moving at " + e.Position );
}
void OnFingerStationary( FingerMotionEvent e )
{
float elapsed = e.ElapsedTime;
if( e.Phase == FingerMotionPhase.Started )
Debug.Log( e.Finger + " started stationary state at " + e.Position );
else if( e.Phase == FingerMotionPhase.Updated )
Debug.Log( e.Finger + " is still stationary at " + e.Position );
else if( e.Phase == FingerMotionPhase.Ended )
Debug.Log( e.Finger + " stopped being stationary at " + e.Position );
}
建議:使用.net代理事件
當使用unity的SendMessage()函數廣播事件消息很友善。可是效率低并且不夠.NET代理事件靈活。
* Gesture Events
每一個手勢識别器都暴露一個公共的OnGesture.NET事件,能夠比對手勢事件和手指事件。使用方法跟用SendMessage()一樣。
[RequireComponent( typeof( TapGesture ) )]
public class TapTutorial : MonoBehaviour
{
void Start()
{
// 在對象裡面尋找輕擊事件識别器
TapRecognizer tap = GetComponent();
// 訂閱它的.NET事件
tap.OnGesture += MyTapEventHandler;
}
void MyTapEventHandler( TapGesture gesture )
{
Debug.Log( "Tap detected at " + gesture.Position );
}
}
有時候你須要停止監聽事件。你能夠用下面辦法:
tap.OnGesture -= MyTapEventHandler;
注意停止監聽事件時候相關對象的生命周期,有可能會導緻記憶體洩露,這是.NET代理事件的陷阱。
第二種方法是,FingerGestures單例暴露一個全局的OnGestureEvent鈎子。能夠監聽到不論什麼手勢事件。
void Start()
{
FingerGestures.OnGestureEvent += FingerGestures_OnGestureEvent;
}
void FingerGestures_OnGestureEvent( Gesture gesture )
{
Debug.Log( gesture.Recognizer.name + " fired its gesture event" );
if( gesture is TapGesture )
Debug.Log( "Tapped: " + ((TapGesture)gesture).Taps );
}
Finger Event
跟上面類似使用方法。
FingerUpDetector.OnFingerUp( FingerUpEvent e )
FingerDownDetector.OnFingerDown( FingerDownEvent e )
FingerHoverDetector.OnFingerHover( FingerHoverEvent e )
FingerMotionDetector.OnFingerMove( FingerMotionEvent e )
FingerMotionDetector.OnFingerStationary( FingerMotionEvent e )
FingerGestures.OnFingerEvent( FingerEvent e )
--EOF
檔案夾
fingerGestures包結構
路徑,相對Assets/Plugin/…
描寫叙述
FingerGestures/
插件的根檔案夾
FingerGestures/Prefabs
能夠直接拖放到場景中的預設資源(prefabs)
FingerGestures/Scripts
核心腳本群組件
FingerGestures/Scripts/Gesture Recognizers
每一個手勢識别 的腳本
FingerGestures/Scripts/Finger Event Detectors
每一個觸摸事件檢測器的腳本
FingerGestures/Scripts/Components
手勢識别和觸摸事件所須要加入的額外元件
FingerGestures/Toolbox
FingerGestures 自帶的工具箱腳本
FingerGestures/Samples.unitypackage
全部樣例的子包
FingerGestures/PlayMaker Actions.unitypackage
FingerGestures對PlayMaker擴充的插件
Editor/FingerGestures
FingerGestures對編輯器的擴充
FingerGestures樣例清單
Finger Event(滑鼠或手指事件)
FingerEventsPart1: 展示怎樣通過不同的檢測器( FingerEventDetectors )去檢測滑鼠或者手指的上(down)、下(up),按下不移動(stationary。懸停(hover) 事件。
FingerEventsPart2: 展示怎樣識别不同滑鼠或者手指動作(FingerMotionDetector)。
Gestures(手勢)
BasicGestures: 識别單擊(react to tap)。輕按兩下(double tap),拖動(drag)。長按(long——press),滑動(swipe)等基礎手勢。
PinchAndTwist: 兩個或多個手指同一時候在觸摸屏上擠壓(pinch)或扭轉(twist)時,觸發手勢的事件。(PS:通常都是用來縮放或旋轉)
PointCloudGestures: 示範怎樣識别一個點雲(point cloud)手勢。(PS:一般是指用使用者畫的圖案作為識别)
Toolbox(工具箱)
Camera(放入錄影機的腳本):
Toolbox-DragView: 展示使用TBDragView腳本,實作拖動視角。
Toolbox-Orbit: 展示使用TBOrbit腳本。實作環繞目标旋轉視角。
Toolbox-Pan: 展示使用TBPan腳本。實作以自身為軸旋轉視角。
Toolbox-PinchZoom: 展示使用TBPinchZoom腳本,實作變焦。
Object-Based(放入普通場景對象的腳本):
Toolbox-Drag: 展示使用TBDrag腳本,實作簡單的物體拖動
Toolbox-Hover: 展示使用TBHoverChangeMaterial 和 TBHoverChangeScale腳本,實作當滑鼠或者手指懸停在物體上時候的響應。(PS:類似滑鼠放到圖示上,圖示發亮的效果)
Toolbox-PinchToScale 展示使用TBPinchToScale腳本,實作縮放物體
Toolbox-TwistToRotate: 展示使用TBTwistToRotate腳本。實作旋轉物體
設定場景
須要在場景中執行個體化一個FingerGesture元件才可使用。 FingerGesture在項目中的作用是管理使用者輸入和識别手勢和滑鼠或手指事件。
有兩種加入方式,一是直接把Plugins\FingerGestures\Prefabs下的FingerGestures prefab檔案拖入場景中。二是能夠建立一個空物件,然後把FingerGestures元件加入進去。
使用Make Persistent标志能夠讓使FingerGestures 單例在跨場景後一直有效,是以僅僅要保證它在第一個場景設定就足夠。
教程:識别一個輕敲手勢
該章節會學習到怎樣識别一個簡單的單擊動作,然後到特殊物件的單擊動作識别,最後到識别一個三個手指的輕按兩下動作。
初始化
第一步,如上章節設定;
第二步。建立一個GameObject 命名為Gestures ;
第三步,給Gestures加入一個TapRecognizer元件,并保持預設設定。你能夠在項目面闆搜尋到它或者直接打開Component > FingerGestures > Gestures > Tap menu item。
TapRecognizer 是當中一種手勢識别器,它用于監控使用者輸入并且當一個有效的單擊動作被識别時候工作。
第四步。建立一個新的C# script 叫做 TapTutorial并加入到第二步建立的Gestures中。
輕敲螢幕
第一步,點選TapGestures元件上的Copy Event To Clipboardbutton,它會把TapGesture所須要的時間信号代碼copy到黏貼闆。
第二步。粘貼到TapTutorial腳本裡,例如以下:
public class TapTutorial : MonoBehaviour
{
void OnTap( TapGesture gesture )
{
}
}
OnTap函數比對定義在TapRecognizer 元件内的資訊名屬性,當識别器要識别一個輕敲手勢。它會使用unity3d的SendMessage API先向Gestures物件内全部的腳本廣播OnTap資訊。僅僅要TapTutorial綁定在該物件上,它的OnTap函數就會被調用到。
出于性能考慮。通常使用.net标準的事件模型取代unity3d的SendMessage API。
第三步。改動OnTop函數:
void OnTap( TapGesture gesture )
{
Debug.Log( "Tap gesture detected at " + gesture.Position +
". It was sent by " + gesture.Recognizer.name );
}
gesture參數包括着手勢事件資料,在上面的代碼。我們主要輸出了位置和TapRecognizer内工作的事件。
你還能夠在gesture參數内獲得很多其它屬性,比如通過gesture.Fingers獲得滑鼠或手指相關的手勢清單,還有能夠通過gesture.Selection獲得目前是哪個場景被輕敲 。
第四步。能夠測試。通過敲不同位置。能夠看到debug資訊輸出。
教程:手勢識别器
在FingerGesture裡,使用者的手勢都由GestureRecognizers元件來處理。它是順序處理被識别比對的使用者動作的。
找到GestureRecognizers
每種手勢都有自己的腳本,存放腳本的路徑在Plugins\FingerGestures\Scripts\Gesture Recognizers 。
你也能夠從 Component > FingerGestures > Gestures menu裡面找到。
基本使用
要識别一個特殊手勢,你須要:
1、加入相應的GestureRecognizer元件到場景中的目标物件。
2、配置它的屬性。
3、監聽它的手勢事件和相應響應。
作為手勢事件通知的一部分。GestureRecognizer傳遞一個包括相關資訊(位置。手指觸屏點清單,選擇的場景物件。相關的GestureRecognizer等)的事件參數。
一個手勢識别器有下面監聽事件的方式:
1、使用标準的.net 托付事件模型。每個手勢識别器都暴露一個.net事件接口。
2、使用unity的SendMessage()函數 :
手勢事件将會被廣播到遊戲對象裡全部的元件。
手勢事件也能夠指向目前相關的場景對象。這時候須要把手勢識别器配置到 `Raycaster `元件中才幹檢測場景對象。
這取決于你的選擇。.net的事件模型較為高效,unity的SendMessage()較為友善。
屬性
由同一基類派生出來的各種手勢識别器共用一個通用配置和一些函數。
比如,我們能夠看到TapRecognizer和SwipeRecognizer元件的配置放置在同一個對象裡。
設定:
你能夠看到,兩個元件共用了一部配置設定置:fingers setup,reset mode,event notification settings,references to additional components...
相同,每一個手勢識别器都有自己獨特的配置。比如滑動識别器要設定距離閥值、速度、和偏差。而多點觸控能夠設定最大持續時間等。
事件資訊廣播:
此處使用SendMessage()函數去通知其它系統。
你能夠使用Message Name屬性去指定響應的函數名。
通常,Message Target會設定你增加的手勢識别器元件。但你也能夠設定别的對象。
元件:
你能夠收到手動指定加入元件。比如:加入一個ScreenRaycaster元件讓手勢識别器獲知場景内對象碰撞。并把消息發送到對應的監聽器。它同意識别器轉發消息到正在有關聯的場景對象。
教程:輕擊手勢識别器
屬性
Required Taps :連續輕擊的次數。
Max Delay Between Taps :兩次輕擊間最大的時間間隔。
(秒)
Movement Tolerance:連續輕敲時候,和第一次輕擊的位置相隔的偏差大小。
Max Duration:最大能夠識别的手指數。
事件
void OnTap( TapGesture gesture )
{
// 輕擊的數量
int taps = gesture.Taps;
}
教程:拖拽手勢識别器
屬性
Movement Tolerance:最小的拖動距離才觸發識别器。
Apply Same Direction Constraint:僅僅能用于多點拖拽,打開後。假設全部點不是向同一個方向拖拽,識别器将不會識别。
事件
void OnDrag( DragGesture gesture )
{
// 目前識别器階段 (Started/Updated/Ended)
ContinuousGesturePhase phase = gesture.Phase;
// 最後一幀的拖拽/移動資料
Vector2 deltaMove = gesture.DeltaMove;
//完整的拖拽資料
Vector2 totalMove = gesture.TotalMove;
}
教程:滑動手勢識别器
屬性
Min Distance: 必須滑動的最小距離。
Max Distance:同意滑動的最大距離。
Min Velocity:滑動時候最小速度。
Max Deviation:同意的最大角度偏差。(度)
事件
void OnSwipe( SwipeGesture gesture )
{
// 完整的滑動資料
Vector2 move = gesture.Move;
// 滑動的速度
float velocity = gesture.Velocity;
// 大概的滑動方向
FingerGestures.SwipeDirection direction = gesture.Direction;
}
教程:長按手勢識别器
屬性
Press Duration:最少長按時間。
Move Tolerance:長按過程中同意的最大移動偏差。
事件
void OnLongPress( LongPressGesture gesture )
{
// 長按持續時間
float elapsed = gesture.ElapsedTime;
}
教程:縮放手勢識别器
屬性
Minimum DOT :同意的小向量點積。
Minimum Distance:兩個手指第一次觸屏時候同意的最短路徑。
事件
void OnPinch( PinchGesture gesture )
{
// 識别器目前狀态(Started/Updated/Ended)
ContinuousGesturePhase phase = gesture.Phase;
// 目前兩個手指的距離
float gap = gesture.Gap;
// 目前與上一幀的變動值
float delta = gesture.Delta;
}
教程:旋轉手勢識别器
屬性
Minimum DOT :同意的小向量點積。
Minimum Rotation:必須的最小自旋角度。
事件
void OnTwist( TwistGesture gesture )
{
// 識别器目前狀态 (Started/Updated/Ended)
ContinuousGesturePhase phase = gesture.Phase;
// 近期一次角度變化(度)
float delta = gesture.DeltaRotation;
// 總的角度變化(度)
float total = gesture.TotalRotation;
}
桌面仿真
在桌面環境。你能夠通過left-CTRL鍵加上滑鼠轉輪去調節角度。也能夠在Mouse Input Provider配置别的按鍵。
教程:自己定義手勢識别器
自從FingerGestures 3.0之後,能夠通過PointCloudRecognizer識别自己定義手勢。利用基于$P recognizer 是手勢比對算法實作。
如今僅僅支援單手指操作的識别,将來會支援多點自己定義手勢。
點雲識别器會對照使用者輸入和已經設定好的手勢模闆,然後會傳回近期接近的比對結果,會傳回比對得分和差距值。
點雲識别器是規模和方向固定不變的,這就意味着它能夠識别畫得比較大或者小的,也或者是反方向的(李若:從左到右變成從右到左)。
點雲識别器模闆
一個模闆包含要識别的手勢的資料。是通過一個編輯器編輯的。
建立一個模闆須要下面步驟:
1:在你的項目編碼。右擊-> create ->PonitCloud Gesture Template
一個新的模闆就好加入到項目裡面,能夠自己重命名。
2:選擇模闆然後在 Inspecrot 面闆内點選 Edit。
3:然後開始繪圖案。
使用點雲識别器
第一步:
1:保證場景對象已經設定好了finger gesture的屬性。
2:建立一個新的Gestures對象。
3:加入一個PointCloudRecognizer元件。
下面屬性須要特别注意。
Max Match Distance:控制識别的精确的程度。數值越低。越精确。
Sampling Distance: 連貫動作取樣時候,兩點間隔的最小距離。
越小越精确,可是取樣會很多其它。
Gesture Templates List:我們指定的模闆清單。
第二步:
加入剛剛建立的模闆拖放到手勢模闆清單中。
第三步:
1、建立一個c#檔案。此處命名為PointCloudTutorial.cs。
2、在PointCloudRecognizer 以下建立一個手勢對象。
3、編輯c#檔案:
public class PointCloudTutorial : MonoBehaviour
{
void OnCustomGesture( PointCloudGesture gesture )
{
Debug.Log( "Recognized custom gesture: " + gesture.RecognizedTemplate.name +
", match score: " + gesture.MatchScore +
", match distance: " + gesture.MatchDistance );
}
}
手勢事件保護以下幾個重要屬性:
gesture.RecognizedTemplate: 被覺得是最佳比對的手勢模闆。
gesture.MatchScore:一個百分比的值,表示比對的程度。
gesture.MatchDistance:一個測量絕對值,表示比對程度。
你還能夠使用其它手勢的屬性。 比如位置和選擇對象等屬性。
用代碼建立模闆
你能夠使用api字自己的編輯器擴充中在執行時候建立手勢模闆。
void Awake()
{
PointCloudGestureTemplate triangle = ScriptableObject.CreateInstance();
triangle.name = "Triangle Gesture Template";
triangle.BeginPoints();
triangle.AddPoint( 0, 1, 1 );
triangle.AddPoint( 0, 2, 2 );
triangle.AddPoint( 0, 3, 1 );
triangle.AddPoint( 0, 1, 1 );
triangle.EndPoints();
PointCloudGestureTemplate square = ScriptableObject.CreateInstance();
square.name = "Square Gesture Template";
square.BeginPoints();
square.AddPoint( 0, 2, 1 );
square.AddPoint( 0, 2, 3 );
square.AddPoint( 0, 4, 3 );
square.AddPoint( 0, 4, 1 );
square.AddPoint( 0, 2, 1 );
square.EndPoints();
PointCloudRegognizer recognizer = gameObject.AddComponent();
recognizer.AddTemplate( triangle );
recognizer.AddTemplate( square );
}
第一個參數AddPoint是一個筆畫的順序,該api臨時僅僅支援單線筆畫的手勢。
當EndPoints()調用時候,手勢模闆會被格式化,全部的點都會又一次繪制成0到1範圍的數。
教程:識别手指事件
FingerGestures 能夠識别向上,向下,懸停。移動,長按等單點輸入手勢。各種FingerEventDetector元件用于識别相應的手指事件。與 GestureRecognizers類似,都是通過廣播資訊去觸發。
FingerEventDetector
全部的手指事件識别器都派生與一個基礎抽象類。
通常。每一個FingerEventDetector執行個體監控着全部手指事件信号。
也能夠配置Finger Index Filter屬性,讓其僅僅跟蹤特定的手指事件。
和手勢識别器一樣,手指事件識别器傳遞一個事件資料對象,改該對象派生于FingerEvent類,包括下面屬性:
屬性
類型
描寫叙述
Name
string
消息的名字
Detector
FingerEventDetector
該次事件中的手指事件識别器
Finger
FingerGestures.Finger
該次事件中的手指類
Position
Vector2
事件所發生的位置
Selection
GameObject
被選中遊戲對象 (依賴`ScreenRaycaster `元件)
Hit/td>
RaycastHit
光線投射碰撞。由`ScreenRaycaster`提供,在正常顯示上很實用
FingerUpDetector
void OnFingerUp( FingerUpEvent e )
{
//手指已經持續的時間
float elapsedTime = e.TimeHeldDown;
}
FingerHoverDetector
void OnFingerHover( FingerHoverEvent e )
{
// 檢查狀态,是進入還是離開.
if( e.Phase == FingerHoverPhase.Enter )
{
Debug.Log( e.Finger + " entered object: " + e.Selection );
}
else if( e.Phase == FingerHoverPhase.Exit )
{
Debug.Log( e.Finger + " exited object: " + e.Selection );
}
}
FingerMotionDetector
該識别器可以識别兩種事件。
1、OnFingerMove :當手指位置距離上一幀位置有發生變化。
2、OnFingerStationary :當手指與上一幀位置一樣。
void OnFingerMove( FingerMotionEvent e )
{
float elapsed = e.ElapsedTime;
if( e.Phase == FingerMotionPhase.Started )
Debug.Log( e.Finger + " started moving at " + e.Position);
else if( e.Phase == FingerMotionPhase.Updated )
Debug.Log( e.Finger + " moving at " + e.Position );
else if( e.Phase == FingerMotionPhase.Ended )
Debug.Log( e.Finger + " stopped moving at " + e.Position );
}
void OnFingerStationary( FingerMotionEvent e )
{
float elapsed = e.ElapsedTime;
if( e.Phase == FingerMotionPhase.Started )
Debug.Log( e.Finger + " started stationary state at " + e.Position );
else if( e.Phase == FingerMotionPhase.Updated )
Debug.Log( e.Finger + " is still stationary at " + e.Position );
else if( e.Phase == FingerMotionPhase.Ended )
Debug.Log( e.Finger + " stopped being stationary at " + e.Position );
}
建議:使用.net代理事件
當使用unity的SendMessage()函數廣播事件消息很友善,可是效率低并且不夠.NET代理事件靈活。
* Gesture Events
每一個手勢識别器都暴露一個公共的OnGesture.NET事件,能夠比對手勢事件和手指事件。
使用方法跟用SendMessage()一樣。
[RequireComponent( typeof( TapGesture ) )]
public class TapTutorial : MonoBehaviour
{
void Start()
{
// 在對象裡面尋找輕擊事件識别器
TapRecognizer tap = GetComponent();
// 訂閱它的.NET事件
tap.OnGesture += MyTapEventHandler;
}
void MyTapEventHandler( TapGesture gesture )
{
Debug.Log( "Tap detected at " + gesture.Position );
}
}
有時候你須要停止監聽事件。你能夠用下面辦法:
tap.OnGesture -= MyTapEventHandler;
注意停止監聽事件時候相關對象的生命周期,有可能會導緻記憶體洩露。這是.NET代理事件的陷阱。
第二種方法是。FingerGestures單例暴露一個全局的OnGestureEvent鈎子,能夠監聽到不論什麼手勢事件。
void Start()
{
FingerGestures.OnGestureEvent += FingerGestures_OnGestureEvent;
}
void FingerGestures_OnGestureEvent( Gesture gesture )
{
Debug.Log( gesture.Recognizer.name + " fired its gesture event" );
if( gesture is TapGesture )
Debug.Log( "Tapped: " + ((TapGesture)gesture).Taps );
}
Finger Event
跟上面類似使用方法。
FingerUpDetector.OnFingerUp( FingerUpEvent e )
FingerDownDetector.OnFingerDown( FingerDownEvent e )
FingerHoverDetector.OnFingerHover( FingerHoverEvent e )
FingerMotionDetector.OnFingerMove( FingerMotionEvent e )
FingerMotionDetector.OnFingerStationary( FingerMotionEvent e )
FingerGestures.OnFingerEvent( FingerEvent e )
--EOF