練習 - 使用界限控制項操作 3D 物件

已完成

ObjectManipulator 指令碼會使用一或兩隻手,讓物件成為可移動、可調整及可旋轉的。 此指令碼支援直接操作輸入模型,因為其可讓使用者用手直接碰觸全像投影。 在這裡,使用 ObjectManipulator 來啟用手部互動,讓您可以移動、調整及旋轉 Rover Explorer。

  1. 此外,您將設定 Rover Explorer,讓您可以將 Rover 零件放在 Rover 上,使其成為完整的 Rover 組件。 在 [階層] 窗格中,展開 RoverExplorer >RoverParts 物件,並選取其所有子 Rover 零件物件和 RoverAssembly 物件,然後在 [偵測器] 窗格中,使用 [新增元件] 按鈕將下列元件新增至所有選取的物件:

    • Object Manipulator (指令碼) 元件
    • Part Assembly Controller (指令碼) 元件

    Screenshot of RoverAssembly with all rover part objects selected and components added.

  2. 在仍選取所有 Rover 零件物件和 RoverAssembly 物件的情況下,在 [偵測器] 窗格中,設定 [Object Manipulator (指令碼)] 元件,如下所示:

    • 在 [基礎 Interactable 設定] 下,找出 On Clicked () 事件。 選取 + 圖示以新增新事件。 設定事件,如下所示:

      a. 藉由從 [階層] 將 RoverAssembly 物件拖曳至 [無 (物件)] 欄位,將其指派為 [On Clicked ()] 事件的接聽程式。

      b. 從 [沒有函式] 下拉式清單中選取 [TapToPlace]>[StartPlacement()],即可在事件觸發時呼叫此方法。

    • 從 [允許操作類型] 下拉式清單中,清除 [縮放] 核取方塊,只啟用 [移動] 和 [選轉]:

    Screenshot of Unity with Two Handed Manipulation Type configured.

  3. 僅選取 RoverAssembly 物件,並移除其中的具狀態 Interactable 元件 (如果有的話)。 選取元件最右邊的三個點,然後選取 [移除元件]。

  4. 在 [專案] 窗格中,瀏覽至 [套件]>[MRTK 標準資產]>[稽核]>[HoloLens2] 資料夾,以尋找音訊剪輯:

    Screenshot of Unity Project window with Audio folder selected.

  5. 在 [階層] 窗格中,重新選取所有 [Rover 零件物件],然後在 [偵測器] 窗格中,選取 [新增元件] 來新增 [音訊來源] 元件,並進行以下設定:

    • MRTK_Scale_Start 音訊剪輯指派給 [AudioClip] 欄位
    • 取消核取 [Play On Awake] (在喚醒時播放) 核取方塊
    • 將 [空間混合] 變更為 [1]

    Screenshot of Unity with all rover parts selected and Audio Source component added and configured.

  6. 在 [階層] 窗格中,展開 RoverAssembly > RoverModel_PlacementHints_XRay >Parts_PlacementHints 物件,以顯示所有位置提示物件,選取第一個 Rover 零件 RoverParts >Camera_Part,然後設定 [Part Assembly Controller (指令碼)] 元件,如下所示:

    • Camera_PlacementHint 物件指派給 [要放置的位置] 欄位

    Screenshot of Unity with Camera_Part PartAssemblyController component configured.

  7. 針對其餘每個 Rover 零件物件和 RoverAssembly 物件重複步驟 5,以設定 [Part Assembly Controller (指令碼)] 元件,如下所示:

    • 針對 Generator_Part,將 Generator_PlacementHint 物件指派給 [要放置的位置] 欄位
    • 針對 Lights_Part,將 Lights_PlacementHint 物件指派給 [要放置的位置] 欄位
    • 針對 UHFAntenna_Part,將 UHFAntenna_PlacementHint 物件指派給 [要放置的位置] 欄位
    • 針對 Spectrometer_Part,將 Spectrometer_PlacementHint 物件指派給 [要放置的位置] 欄位
    • 針對 RoverAssembly,將物件本身 (也就是相同的 RoverAssembly 物件) 指派給 [要放置的位置] 欄位
  8. 在 [階層] 窗格中,選取 [RoverExplorer] > [按鈕] > [重設] 按鈕物件,然後在 [偵測器] 窗格中,設定 PressableButton OnClicked () 事件,如下所示:

    • RoverAssembly 物件指派給 [無 (物件)] 欄位
    • 從 [沒有函式] 下拉式清單中,選取 [PartAssemblyController]>[ResetPlacement ()],以將此函式設定為觸發事件時所要執行的動作

    Screenshot of Unity with Reset button object OnClick event configured.

  9. 如果您現在進入遊戲模式,您可以使用近或遠的互動來將 Rover 零件放在 Rover 上。 一旦組件接近相對應的放置提示,就會貼齊位置,並成為 Rover 的一部分。 若要重設放置,您可以按 [重設] 按鈕:

    Screenshot of Unity Play mode split view with Reset button being pressed.

新增界限控制項

  1. 在 [階層] 視窗中選取 RoverExplorer 物件,然後在 [偵測器] 視窗中使用 [新增元件] 按鈕來新增 BoundsControl 元件。 取消核取元件旁的核取方塊,將其預設為停用

    Screenshot of Unity with RoverExplorer object selected and components added and disabled.

  2. 在 [專案] 視窗中,瀏覽至 [套件]>[MRTK 空間操作]>[BoundsControl]>[Prefabs] 資料夾,按住並拖 BoundingBoxWithHandles 預製物件至 [界限控制項] 元件的 [界限視覺效果預製物件] 欄位。

    Screenshot of Unity with RoverExplorer object selected and the Bounds Visuals Prefab field configured.

  3. 在 [階層] 窗格中,展開 [功能表] >Buttons-GridLayout (按鈕) 物件以顯示三個按鈕、將第三個按鈕重新命名為 BoundsControl_Enable,然後在 [階層] 窗格中,設定 [BoundsControl_Enable] 遊戲物件,如下所示:

    • 選取 [Frontplate] > [AnimatedContent] > [Icon] > [Label] 物件,然後將 TextMeshPro 元件變更為 [啟用]。 請確定 Label 物件已在階層中啟用
    • RoverExplorer 物件指派給 [無 (物件)] 欄位,然後從 [沒有函式] 下拉式清單中選取 [BoundsControl]>[bool Enabled] 來設定 PressableButton.OnClicked() 事件 (確認已核取引數核取方塊)
    • 選取小型 + 圖示,以新增另一個事件
    • RoverExplorer 物件指派給 [無 (物件)] 欄位
    • 從 [沒有函式] 下拉式清單中,選取 [ObjectManipulator]>[bool Enabled] 以在觸發事件時更新此屬性值,並確認已核取引數核取方塊
    • 選取小型 + 圖示,以新增另一個事件
    • RoverExplorer 物件指派給 [無 (物件)] 欄位
    • 從 [沒有函式] 下拉式清單中,選取 [BoundsControl]>[bool HandlesActive] 以在觸發事件時更新此屬性值,並確認已核取引數核取方塊
    • 選取 [Frontplate] > [AnimatedContent] > [Icon] > [UIButtonFontIcon] 物件,並將 Icon 變更為 [字型圖示選取器] 元件上的四個箭頭圖示。 您可以在圖示清單中找到此項目,或將 ** 目前圖示名稱** 設定為 'Icon 40'

    Screenshot of Unity with BoundsControl_Enable button object selected and Button Config Helper component configured.

  4. 複製 BoundsControl_Enable 按鈕,並將按鈕重新命名為 BoundsControl_Disable,然後在 [偵測器] 窗格中,設定 [Button Config Helper (指令碼)] 元件,如下所示:

    • 選取 [Frontplate] > [AnimatedContent] > [Icon] > [Label] 物件,然後將 TextMeshPro 元件變更為 [停用]
    • 確定事件下的所有核取方塊皆未核取,以設定 PressableButton.OnClicked() 事件

    Screenshot of Unity with BoundsControl_Disable button object selected and Button Config Helper component configured.

  5. 如果您現在進入遊戲模式,然後選取 [啟用] 以啟用 [界限控制項],您可以使用近或遠的互動來移動、旋轉及調整界限控制項,然後選取 [停用] 以再次停用界限控制項:

    Screenshot of Unity Play mode split view with Bounds Control being manipulated.