HoloLens開發學習記錄--- 4.Gesture手勢操作( 導航旋轉 + 點擊手勢時的指示器 [不同於方向指示器] + 拖拽)

創建一個新的 Unity 項目 ,初始化項目:   

一,前期界面操作

1.導入 MRTK 包

2.應用項目設置爲 MR 項目

3.使用 HoloLensCamera 替代默認相機

4.添加 CursorWithFeedback

5.添加 InputManager

6.設置 InputManager 的 SimpleSinglePointerSelector 腳本的 Cursor 屬性爲添加的 CursorWithFeedback

7.添加一個 Cube,位置如下

最終 Hierarchy 結構如下:

8.  創建圖片文件夾 -----  拖圖片到文件夾下

9. 創建材質文件夾-------新建材質---------並改變材質中的shader -----拖動圖片到材質即可

Material_Baby

二,添加自己寫的腳本到cube上    (Navigation.cs 導航的腳本  使cube可以旋轉)      INavigationHandler接口必須有的四個方法

實現導航旋轉手勢主要是實現 INavigationHandler 接口,在 OnNavigationUpdated() 方法中改變 Cube 的 Rotate。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using HoloToolkit.Unity.InputModule;


public class CubeNavigation : MonoBehaviour,INavigationHandler
{
    [Tooltip("旋轉速度")] //設置一個浮動窗口
    public float RotationSensitivity = 10.0f;

    public void OnNavigationCanceled(NavigationEventData eventData)   //選擇旋轉取消時,輸入到“手勢輸入管理器”InputManger 爲空
    {
        InputManager.Instance.PopModalInputHandler();
    }
    public void OnNavigationCompleted(NavigationEventData eventData)  //選擇旋轉完成時,輸入到“手勢輸入管理器”InputManger 爲空
    {
        InputManager.Instance.PopModalInputHandler();
    }
    public void OnNavigationStarted(NavigationEventData eventData)    //選擇旋轉開始時,輸入到“手勢輸入管理器”InputManger 爲當前物體gameObject
    {
        InputManager.Instance.PushModalInputHandler(gameObject);
    }
    public void OnNavigationUpdated(NavigationEventData eventData)   //選擇旋轉正在更新時,輸入到“手勢輸入管理器”InputManger 爲當前物體gameObject
    {
        // 計算旋轉值,其中:eventData的CumulativeDelta返回手勢導航差值,值域[-1, 1]
        float rotationFactor = eventData.CumulativeDelta.x * RotationSensitivity;
        transform.Rotate(new Vector3(0, -1 * rotationFactor, 0));
    }
}

三,Hand Guidance實現一個當手勢快要超出檢測範圍時,給出提示的效果。[手的指示器]

[真機運行:當射線檢測不到物體時,手勢又處於點擊狀態,則顯示出可以旋轉的物體的方位在何處]

1.在 Hierarchy 創建一個空的 gameObject 並重命名爲 HandGuidanceManager,爲其添加 MRTK 的 HandGuidance.cs 腳本。

2.設置該腳本的 Cursor 屬性爲 Hierarchy 中的 CursorWithFeedback,設置其 HandGuidanceIndicator 屬性爲 MRTK 中的 HeadsUpDirectionIndicatorPointer。

3.HandGuidanceThreshold 屬性含義是:當開始顯示手動導航指示器時。1不在視圖中,0在視圖中居中。

 

四, 添加拖拽腳本,實現拖拽移動(CubeManipulation.cs 操縱腳本,使cube可以拖拽)

新建一個腳本 CubeManipulation.cs,並將其添加到 Cube 上。IManipulationHandler手勢拖拽接口必須有四個方法

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using HoloToolkit.Unity.InputModule;

public class CubeManipulation : MonoBehaviour , IManipulationHandler
{
    //cube 移動前的位置
    private Vector3 OrigiPosition;

    public void OnManipulationCanceled(ManipulationEventData eventData)
    {
        InputManager.Instance.PopModalInputHandler();
    }
    public void OnManipulationCompleted(ManipulationEventData eventData)
    {
        InputManager.Instance.PopModalInputHandler();
    }
    public void OnManipulationStarted(ManipulationEventData eventData)
    {
        InputManager.Instance.PushModalInputHandler(gameObject);
        //開始移動前,保存Cube原始位置
        OrigiPosition = transform.position;
    }
    public void OnManipulationUpdated(ManipulationEventData eventData)
    {
        transform.position = OrigiPosition + eventData.CumulativeDelta;
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章