Chapter 1 - Gaze(凝視)
目標
創建一個隨“視線”移動的光標
實踐
在Project面板中,找到”Assets/HoloToolkit/Input/Prefabs/InputManager.prefab”,拖動到Hierarchy根目錄
同樣,將”Assets/HoloToolkit/Input/Prefabs/Cursor/Cursor.prefab”,拖動到Hierarchy根目錄
說明
InputManager.prefab
輸入管理器,用來管理視線、手勢等輸入源。
這個管理器還提供了在編輯器中模擬輸入的功能:
Shift:左手
Space:右手
鼠標移動:模擬手移動
鼠標左鍵:模擬手點擊
鼠標右鍵:模擬視線移動
WSAD/QE:攝像機移動
Cursor.prefab
工具包自帶光標之一,主要實現凝視物體時,出現附着圓環,否則光標發亮。
凝視物體和不凝視物體
其他幾個自帶光標如下:
BasicCursor.prefab:基礎光標,凝視物體出現附着圓環,否則不顯示。
凝視物體和不凝視物體
CursorWithFeedback.prefab:手勢檢測光標,當檢測到手時,會變成一個手勢圖標。
DefaultCursor.prefab:默認光標,模擬Hololens系統內置光標。
Chapter 2 - Gestures(手勢識別)
目標
點擊Cube,Cube墜落
實踐
新建文件夾:”Assets/_Scenes/Holograms 101/Scripts/”
新建C#腳本:”Assets/_Scenes/Holograms 101/Scripts/Cube.cs”,內容如下:
using HoloToolkit.Unity.InputModule;
using UnityEngine;
public class Cube : MonoBehaviour, IInputClickHandler
{
/// <summary>
/// 點擊事件(包含手勢點擊和Clicker設備的點擊)
/// </summary>
public void OnInputClicked(InputEventData eventData)
{
// 爲Cube增加剛體,產生掉落效果
if (!this.GetComponent<Rigidbody>())
{
var rigidbody = this.gameObject.AddComponent<Rigidbody>();
rigidbody.collisionDetectionMode = CollisionDetectionMode.Continuous;
}
}
}
將腳本拖拽至Cube
說明
IInputClickHandler
點擊事件處理接口,需要實現OnInputClicked(InputEventData eventData) 方法
在該方法中實現具體的邏輯。
HoloToolkit中還提供了更多的事件處理接口,如下:
IFocusable 凝視聚焦事件,當視線進入或離開物體的觸發
IHoldHandle 處理Hold手勢事件
IInputHandler 處理點擊過程中的按下和鬆開事件
IInputClickHandler 處理點擊事件
IManipulationHandler 處理手勢操縱事件,事件返回手勢偏移量
INavigationnHandler 處理手勢導航事件,事件返回手勢偏移量,值域[-1, 1]
ISourceStateHandler 處理事件源的狀態監測,比如:手勢離開檢測區域
ISpeechHandler 處理語音命令(5.5.1f1新增)
Chapter 3 - Voice(聲音)
目標
語音命令控制Cube墜落
實踐
打開Player Settings…面板,在Publishing Settings>Capabilities中,勾選Microphone
修改文件:”Assets/_Scenes/Holograms 101/Scripts/Cube.cs”,如下:
using HoloToolkit.Unity.InputModule;
using UnityEngine;
public class Cube : MonoBehaviour, IInputClickHandler
{
// Cube原始位置
Vector3 originalPosition;
void Start()
{
// 保存Cube原始位置
originalPosition = this.transform.localPosition;
}
/// <summary>
/// 點擊事件(包含手勢點擊和Clicker設備的點擊)
/// </summary>
public void OnInputClicked(InputEventData eventData)
{
OnDrop();
}
// 重置Cube位置
public void OnReset()
{
// 刪除Cube的剛體,取消掉落效果
var rigidbody = this.GetComponent<Rigidbody>();
if (rigidbody != null)
{
DestroyImmediate(rigidbody);
}
// 重置Cube位置
this.transform.localPosition = originalPosition;
}
// 讓Cube掉落
public void OnDrop()
{
// 爲Cube增加剛體,產生掉落效果
if (!this.GetComponent<Rigidbody>())
{
var rigidbody = this.gameObject.AddComponent<Rigidbody>();
rigidbody.collisionDetectionMode = CollisionDetectionMode.Continuous;
}
}
}
在Hierarchy中添加一個空的GameObject,命名爲:”Controller” 將”Assets/HoloToolkit/Input/Scripts/Voice/KeywordManager.cs”拖拽至”Controller”
點擊”Controller”,在Inspector面板中,按圖進行設置:
其中:Keyword對應的語音命令,Response()面板中設置響應的對象及方法
說明
爲什麼我發出語音命令,但是沒有反應?
檢查一下上面的步驟可有遺漏?
使用Holographics Remoting Player進行調試時,如果有外置麥克風,請試着對外置麥克風說話
請注意勾選Microphone功能
爲什麼要創建一個單獨的”Controller”對象來放置語音命令腳本?
個人喜好,方便管理。將”KeywordManager.cs”放置在其他對象上也是可以的。
但需要提醒的是,儘可能不要放置到HoloToolkit內置的Prefab上。
由於目前HoloToolkit-Unity在Github上更新頻率相當快!在項目中儘量保持組件的獨立性,便於以後升級版本。
Chapter 4 - Spatial sound(空間聲音)
目標
把Cube變成“音樂盒”,隨着Cube的墜落,聲音消失
實踐
打開菜單:”Edit > Project Settings > Audio”,將Spatializer Plugin修改爲:MS HRTF Spatializer,如圖所示:
找到聲音文件:”Assets/HoloToolkit/SpatialSound/Tests/Support/Audio/Vocals.wav”
將其拖拽到Cube上,點擊Cube,按下圖調整Audio Source:
說明
Spatial Blend 調整聲音的3D效果
Doppler Level 多普勒級別越大,移動速度對聲音波長的影響越大,移動中會導致“變聲”
Volume Rolloff 音量衰減模式
Chapter 5 - Spatial mapping(空間映射)
目標
掃描房間,將Cube放置在房間地面、牆體等地方
實踐
找到文件:”Assets/HoloToolkit/SpatialMapping/Prefabs/SpatialMapping.prefab”
拖拽到Hierarchy 根級
空間映射完成,測試運行!
注意:第一次運行時,需要耐心等待一段時間
找到文件:”Assets/HoloToolkit/Utilities/Scripts/WorldAnchorManager.cs”
拖拽到Controller上
找到文件:”Assets/HoloToolkit/SpatialMapping/Scripts/TapToPlace.cs”
拖拽到Cube 上
單擊Cube,在Inspector面板上,去掉Cube (Script)的勾選(否則在點擊Cube時會出現異常)
放置物體完成,測試運行!
注意:需要等待空間映射效果出現後,才能放置Cube
說明:
SpatialMapping.prefab 內置空間映射組件
WorldAnchorManager.cs 內置空間座標管理器
TapToPlace.cs 單擊並放置物體到空間的腳本,內置的