# 10.19 * 在 Unity 中尝试引入 MRTK * 两种可选方法: * 直接修改 manitest.json 利用 Unity Package Manager 引入 * 可能由于网络问题,一直停留在下载阶段,最后决定放弃这个方法 * 直接从 Github 下载相关的 .unitypackage 文件(已经放在 MRTK package 文件夹下) * 按 Foundation-Extensions-Examples-TestUtilities-Tools 的顺序依次导入包 * 在导入 Foundation 后会出现 Configurator 界面直接全选 Apply 确保其正常使用 * 此外还需要引入 TextMeshPro 才能正常使用一些预制体 * 最后重启 Unity 即可完成引入 * 修改目标平台 * 修改为 Universal Windows Platform * 学习场景 HandInteractionExamples (Assets/MRTK/Examples/Demos/HandTracking/Scenes/HandInteractionExamples.unity) * Button * 目录:Assets/MRTK/SDK/Features/UX/Interactable/Prefabs * MRTK 提供了各种尺寸以及样式的按钮 * HoloLens2 风格: * PressableButton * 按钮式的 checkbox / switch / radio * 以及对应的普通样式的一系列按钮 * 支持的交互方式: * 直接手指触碰 * Gaze + air-tap 即将屏幕重心对准按钮,再配合轻捏手指的动作进行交互 * 语音交互 * MRTK 推荐使用带有背景的按钮以更易于观察以及理解是否有交互 * 使用方法: * 基于 UnityUI 的按钮: * 创建一个 Canvas,选择 Convert to MRTK Canvas,再 Add NearInteractionTouchableUnityUI,并将其 scale 设为 (0.001, 0.001, 0.001),否则太大了会看不见 * 使用 PressableButtonUnityUI / PressableButtonUnityUICircular / PressableButtonHoloLens2UnityUI 预制体 * 基于碰撞的按钮: * 直接将相应的按钮拖到场景中 * 个人认为这类按钮更易于使用 * 在 Interactable 脚本下,Events -> OnClick() 中设置按钮触发的相关方法 * 可以在 PhysicalPressEventRouter 中配制何时触发 OnClick() 方法 * 此外,也可以在 PressableButton 脚本中配制按钮的触发逻辑,但此种方法只支持直接触碰 * ButtonConfigHelper 脚本下可以修改按钮的图标、文本以及 label 等属性 * 若要自定义图标,则需要 Create > Mixed Reality Toolkit > Icon Set,并在其中加入所需要的图标并将其作用于 ButtonConfigHelper 上 * 可以使用 Mixed Reality Toolkit -> Utilities -> Migration Window -> Migration Handler Selection -> Microsoft.MixedReality.Toolkit.Utilities.ButtonConfigHelperMigrationHandler 将项目内的所有自定义图标加入到同一个 IconSet 中,会创建在 MixedRealityToolkit.Generated/CustomIconSets * 可以通过创建 Icon Font Asset 来实现在运行时通过代码以及图标的 tag 进行图标的替换(暂时用不上所以未尝试) * 修改按钮的大小: * 先修改 FrontPlate / Quad / Box Collider 的大小 * 最后点击预制体上 Fix Bounds 按钮即可 * 使用关键词识别触发按钮: * 官方文档中在 Interactable 脚本下有 VoiceCommand 属性可以直接配制关键词 * 但在实际的项目中,我发现只有 SpeechCommand 可以进行配制 * 需要 Create > Mixed Reality Toolkit > Profiles > Mixed Reality Input System Profile 中配制关键词后进行选择 * 之后可能需要多加测试 * 官方同时提供了从头做一个按钮的方法在[文档](https://microsoft.github.io/MixedRealityToolkit-Unity/Documentation/README_Button.html),见 How to make a button from scratch * Bounds control 脚本 * 场景 BoundsControlExamples 中有更详细的事例,可以观察到提供了物体的移动、旋转、缩放功能,通过手势选取不同的边界位置以区分 * 属性: * Activation behavior:边界是否可见的条件选择 * 基于碰撞盒,只支持 box collider * Links configuration (wireframe) :设置不同的边界材质 * Proximity effect configuration:区分远中近三种交互情况的参数设置 * 约束:使用 ConstraintManager 脚本 * 可以在 Events 中调用相应的脚本 * 也可以在 ObejectManipulator 脚本中进行统一调用 * Manipulation Handler 脚本 * 配合 Collider / NearInterationGrabbable / Bounding Box 使用 * 可配置单手以及双手操作,以及不同的移动、旋转、缩放功能 * Slate:可交互的 2D 显示 UI * 类似平时常用的软件窗口 * FollowMe 按钮:使得窗口始终跟随用户视线移动 * System keyboard * 任何时候可以用代码调用 ```C# public TouchScreenKeyboard keyboard; public void OpenSystemKeyboard() { keyboard = TouchScreenKeyboard.Open("", TouchScreenKeyboardType.Default, false, false, false, false); } private void Update() { if (keyboard != null) { keyboardText = keyboard.text; // Do stuff with keyboardText } } ```