手勢識別是HoloLens交互的重要輸入方法之一。HoloLens提供了底層API和高層API,可以滿足不同的手勢定制需求。底層API能夠獲取手的位置和速度信息,高層API則借助手勢識別器來識別預設的手勢(包括,單擊、雙擊、長按、平移等等)。
手勢輸入 Gesture Input
本部分為高級API使用,通過輸入源來識別手勢。每個手勢對應一個SourceKind輸入源,大部分手勢事件都是系統預設的事件,有些事件會提供額外的上下文信息。
只需要很少的步驟就能使用GestureRecognizer集成手勢識別:
- 創建GestureRecognizer實例
- 注冊指定的手勢類型
- 訂閱手勢事件
- 開始手勢識別
private GestureRecognizer recognizer; // Use this for initialization void Start() { // 創建GestureRecognizer實例 recognizer = new GestureRecognizer(); // 注冊指定的手勢類型 recognizer.SetRecognizableGestures(GestureSettings.Tap | GestureSettings.Hold); // 訂閱手勢事件 recognizer.HoldStartedEvent += Recognizer_HoldStartedEvent; recognizer.TappedEvent += Recognizer_TappedEvent; //開始手勢識別 recognizer.StartCapturingGestures(); } private void Recognizer_TappedEvent(InteractionSourceKind source, int tapCount, Ray headRay) { Debug.Log("Tap"); } private void Recognizer_HoldStartedEvent(InteractionSourceKind source, Ray headRay) { Debug.Log("hold"); } // Update is called once per frame void Update() { } void OnDestory() { recognizer.TappedEvent -= Recognizer_TappedEvent; recognizer.HoldStartedEvent -= Recognizer_HoldStartedEvent; }
停止手勢識別
recognizer.StopCapturingGestures();
底層API Interaction Input
底層API運行獲得輸入來源的更多詳細信息,例如它在世界中的位置和速度。
如何處理底層交互事件
使用底層交互是很容易的:
- 注冊InteractionManager事件
- 處理事件
停止它也很容易:
- 取消注冊事件
注冊底層交互事件
對於每種你需要的底層事件,你都需要去注冊它
InteractionManager.SourcePressed += InteractionManager_SourcePressed;
處理底層交互事件
一旦注冊了底層交互事件,在事件發生時你就可以得到回調。你可以使用獲取到的時間信息來處理應用行為。
void InteractionManager_SourcePressed(InteractionSourceState state) { // state變量里包含以下信息: // 當前凝視射線信息 // 來源是否被點擊 // 位置、速度之類的屬性 // 來源id和來源類型 (hand, voice, controller或其他) }
如何停止交互事件
當你不再想要關注一些事件后,只需要取消時間注冊即可。
InteractionManager.SourcePressed -= InteractionManager_SourcePressed;
輸入源變化事件
這些事件描述了輸入源的當前狀態:
- detected(即將激活)
- lost(即將取消激活)
- updates(移動或者一些狀態在變化)
- is pressed(點擊、按鈕按下或者語音選中)
- is released(點擊結束,按鈕松開,語音選中結束)
輸入源狀態
每個事件都會有一個InteractionSourceState參數,這個參數代表了實時輸入源狀態:
- 是否是點擊狀態
- InteractionSourceProperties包含了輸入源位置信息 InteractionSourceLocation,能夠獲得當前輸入源位置和速度信息
- 凝視射線信息,用於判斷事件發生時用戶是否在注視目標
- 來源類型信息,包括hand、voice、controller或者其他類型
示例代碼
using UnityEngine.VR.WSA.Input; void Start () { InteractionManager.SourceDetected += InteractionManager_SourceDetected; InteractionManager.SourceUpdated += InteractionManager_SourceUpdated; InteractionManager.SourceLost += InteractionManager_SourceLost; InteractionManager.SourcePressed += InteractionManager_SourcePressed; InteractionManager.SourceReleased += InteractionManager_SourceReleased; } void OnDestroy() { InteractionManager.SourceDetected -= InteractionManager_SourceDetected; InteractionManager.SourceUpdated -= InteractionManager_SourceUpdated; InteractionManager.SourceLost -= InteractionManager_SourceLost; InteractionManager.SourcePressed -= InteractionManager_SourcePressed; InteractionManager.SourceReleased -= InteractionManager_SourceReleased; } void InteractionManager_SourceDetected(InteractionSourceState state) { // 識別到來源 } void InteractionManager_SourceLost(InteractionSourceState state) { //丟失來源 } void InteractionManager_SourceUpdated(InteractionSourceState state) { //來源被更新 } void InteractionManager_SourcePressed(InteractionSourceState state) { //來源被按下 } void InteractionManager_SourceReleased(InteractionSourceState state) { // 來源被松開 }