创建一个新的 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;
}
}