創建一個新的 Unity 項目 ,初始化項目:
一,前期界面操作
1.導入 MRTK 包
2.應用項目設置爲 MR 項目
3.使用 HoloLensCamera 替代默認相機
4.添加 CursorWithFeedback
5.添加 InputManager
6.設置 InputManager 的 SimpleSinglePointerSelector 腳本的 Cursor 屬性爲添加的 CursorWithFeedback
7.添加一個 Cube,位置如下
最終 Hierarchy 結構如下:
8. 創建圖片文件夾 ----- 拖圖片到文件夾下
9. 創建材質文件夾-------新建材質---------並改變材質中的shader -----拖動圖片到材質即可
二,添加自己寫的腳本到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;
}
}