Hololens API解析Input-GestureRecognizer

命名空間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();
            }
        }
}


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

發佈了31 篇原創文章 · 獲贊 51 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章