Hololens API解析Input-GestureRecognizer

山谷大叔發表於2017-09-05

名稱空間UnityEngine.VR.WSA.Input
使用API來識別使用者動作的管理類。
GestureRecognizer
Hololens手勢識別,完成點選,拖拽等操作。

建構函式

GestureRecognizer

建立一個手勢識別器。

公共函式

CancelGestures

取消任何掛起的手勢事件。此外,這將呼叫StopCapturingGestures

Dispose

釋放手勢識別器所使用的資源。

GetRecognizableGestures

獲取當前啟用的手勢的一個mask。

IsCapturingGestures

用於查詢手勢是否正在接收手勢事件。

SetRecognizableGestures

將可識別的手勢設定為newMaskValues中指定的,並返回舊的設定。

StartCapturingGestures

開始接收手勢事件。在呼叫此方法之前,不會收到任何事件。

StopCapturingGestures

停止接收手勢事件。

事件

GestureErrorEvent

當手勢識別器發出警告或錯誤時,就會被觸發。

HoldCanceledEvent

當使用者使用他們的手或語言進行取消事件時,就會被觸發。

HoldCompletedEvent

當使用者完成一個手勢時,就會被觸發。

HoldStartedEvent

當使用者開始持有手勢時,就會被觸發。

ManipulationCanceledEvent

當操作手勢被取消時,就會被觸發。

ManipulationCompletedEvent

當操作手勢被完成時,就會被觸發。

ManipulationStartedEvent

當互動成為一個操作手勢時,就會被觸發。

ManipulationUpdatedEvent

當操作手勢因手移動而更新時,就會被觸發。

當導航手勢取消時,就會被觸發。

當導航手勢完成時,就會被觸發。

當導航手勢開始時,就會被觸發。

當導航手勢更新時,就會被觸發。

RecognitionEndedEvent

當操作手勢因手移動而更新時,就會被觸發。

RecognitionStartedEvent

當手勢識別完成時,或者手勢完成或取消時,就會被觸發。

TappedEvent

當出現點選手勢時,就會被觸發。

委託

GestureErrorDelegate

回撥錶示出現錯誤或警告

HoldCanceledEventDelegate

回撥錶示一個Hold取消事件。

HoldCompletedEventDelegate

回撥錶示一個Hold完成事件。

HoldStartedEventDelegate

回撥錶示一個Hold開始事件。

ManipulationCanceledEventDelegate

回撥錶示一個操作取消事件。

ManipulationCompletedEventDelegate

回撥錶示一個操作完成事件。

ManipulationStartedEventDelegate

回撥錶示一個操作開始事件。

ManipulationUpdatedEventDelegate

回撥錶示一個操作更新事件。

回撥錶示一個導航取消事件。

回撥錶示一個導航完成事件。

回撥錶示一個導航開始事件。

回撥錶示一個導航更新事件。

RecognitionEndedEventDelegate

回撥錶示手勢事件已經完成。

RecognitionStartedEventDelegate

回撥錶示手勢事件已經開始。

TappedEventDelegate

回撥指示一個點選事件。


下面的程式碼完成GestureRecognizer的初始化設定及事件的註冊和登出

using UnityEngine.VR.WSA.Input;
public class GesturesInput: MonoBehaviour{
//手勢識別管理器,手勢和導航不相容,各自需要一個
 GestureRecognizer gestureRecognizer;
 GestureRecognizer navigationGestureRecognizer;
//第一個是讓識別器立即啟動。第二個允許識別器在稍後的時候手動啟動。
 public enum RecognizerStartBehavior { AutoStart, ManualStart };
 void Start()
 {
            gestureRecognizer = new GestureRecognizer();
            //註冊手勢事件
            gestureRecognizer.TappedEvent += OnTappedEvent;
            gestureRecognizer.HoldStartedEvent += OnHoldStartedEvent;
            gestureRecognizer.HoldCompletedEvent += OnHoldCompletedEvent;
            gestureRecognizer.HoldCanceledEvent += OnHoldCanceledEvent;
            //註冊操作開始事件
            gestureRecognizer.ManipulationStartedEvent += OnManipulationStartedEvent; 
            gestureRecognizer.ManipulationUpdatedEvent += OnManipulationUpdatedEvent; 
            gestureRecognizer.ManipulationCompletedEvent += OnManipulationCompletedEvent; 
            gestureRecognizer.ManipulationCanceledEvent += OnManipulationCanceledEvent; 
             //設定可識別的手勢
            gestureRecognizer.SetRecognizableGestures(GestureSettings.Tap | 
                                                      GestureSettings.ManipulationTranslate |
                                                      GestureSettings.Hold);
             navigationGestureRecognizer = new GestureRecognizer();
            //註冊導航事件
            navigationGestureRecognizer.NavigationStartedEvent += OnNavigationStartedEvent;
            navigationGestureRecognizer.NavigationUpdatedEvent += OnNavigationUpdatedEvent;
            navigationGestureRecognizer.NavigationCompletedEvent += OnNavigationCompletedEvent;
            navigationGestureRecognizer.NavigationCanceledEvent += OnNavigationCanceledEvent;  
             if (UseRailsNavigation)//使用Rails導航
            {
                navigationGestureRecognizer.SetRecognizableGestures(GestureSettings.NavigationRailsX |
                                                                    GestureSettings.NavigationRailsY |
                                                                    GestureSettings.NavigationRailsZ);
            }
            else//使用3D導航
            {
                navigationGestureRecognizer.SetRecognizableGestures(GestureSettings.NavigationX |
                                                                    GestureSettings.NavigationY |
                                                                    GestureSettings.NavigationZ);
            }

            if (RecognizerStart == RecognizerStartBehavior.AutoStart)
            {
                //開始捕捉操和導航手勢
                gestureRecognizer.StartCapturingGestures();
                navigationGestureRecognizer.StartCapturingGestures();
            }                                                    
 }      

       void OnDestroy()
        {
            //關閉手勢捕捉
            StopGestureRecognizer();
            //登出事件,釋放資源
            if (gestureRecognizer != null)
            {
                gestureRecognizer.TappedEvent -= OnTappedEvent;

                gestureRecognizer.HoldStartedEvent -= OnHoldStartedEvent;
                gestureRecognizer.HoldCompletedEvent -= OnHoldCompletedEvent;
                gestureRecognizer.HoldCanceledEvent -= OnHoldCanceledEvent;

                gestureRecognizer.ManipulationStartedEvent -= OnManipulationStartedEvent;
                gestureRecognizer.ManipulationUpdatedEvent -= OnManipulationUpdatedEvent;
                gestureRecognizer.ManipulationCompletedEvent -= OnManipulationCompletedEvent;
                gestureRecognizer.ManipulationCanceledEvent -= OnManipulationCanceledEvent;

                gestureRecognizer.Dispose();
            }
            if (navigationGestureRecognizer != null)
            {
                navigationGestureRecognizer.NavigationStartedEvent -= OnNavigationStartedEvent;
                navigationGestureRecognizer.NavigationUpdatedEvent -= OnNavigationUpdatedEvent;
                navigationGestureRecognizer.NavigationCompletedEvent -= OnNavigationCompletedEvent;
                navigationGestureRecognizer.NavigationCanceledEvent -= OnNavigationCanceledEvent;

                navigationGestureRecognizer.Dispose();
            }
        }

      void OnDisable()
        {
            StopGestureRecognizer();
        }

       void OnEnable()
        {
            if (RecognizerStart == RecognizerStartBehavior.AutoStart)
            {
                StartGestureRecognizer();
            }
        }
        // 開始手勢識別(在沒有捕捉的狀態下)
        public void StartGestureRecognizer()
        {
            if (gestureRecognizer != null && !gestureRecognizer.IsCapturingGestures())
            {
                gestureRecognizer.StartCapturingGestures();
            }
            if (navigationGestureRecognizer != null && !navigationGestureRecognizer.IsCapturingGestures())
            {
                navigationGestureRecognizer.StartCapturingGestures();
            }
        }

        //關閉手勢識別(在捕捉手勢的狀態下)
        public void StopGestureRecognizer()
        {
            if (gestureRecognizer != null && gestureRecognizer.IsCapturingGestures())
            {
                gestureRecognizer.StopCapturingGestures();
            }
            if (navigationGestureRecognizer != null && navigationGestureRecognizer.IsCapturingGestures())
            {
                navigationGestureRecognizer.StopCapturingGestures();
            }
        }
}


手勢事件的回撥方法在下個章節講解,敬請關注!

相關文章