演習 - 境界コントロールを使用して 3D オブジェクトを操作する

完了

ObjectManipulatorスクリプトは、1 つまたは 2 つの手を使用してオブジェクトを移動可能でスケーラブルで回転可能にします。 このスクリプトは、ユーザーが手でホログラムに直接触れることを可能にするため、直接操作入力モデルをサポートしています。 ここでは、 ObjectManipulator を使用して手動操作を有効にして、ローバー エクスプローラーを移動、スケーリング、回転できるようにします。

  1. さらに、ローバー エクスプローラーを構成して、ローバー パーツを Rover に配置して、完全な Rover アセンブリにします。 [階層] ウィンドウで、RoverExplorer >RoverParts オブジェクトを展開し、すべての子ローバー パーツ オブジェクトと RoverAssembly オブジェクトを選択し、[インスペクター] ウィンドウで [ コンポーネントの追加 ] ボタンを使用して、選択したすべてのオブジェクトに次のコンポーネントを追加します。

    • オブジェクト マニピュレーター (スクリプト) コンポーネント
    • パーツ アセンブリ コントローラー (スクリプト) コンポーネント

    すべてのローバー パーツ オブジェクトが選択され、コンポーネントが追加された RoverAssembly のスクリーンショット。

  2. すべてのローバー パーツ オブジェクトと RoverAssembly オブジェクトが選択された状態で、[インスペクター] ウィンドウで、 オブジェクト マニピュレーター (スクリプト) コンポーネントを次のように構成します。

    • [ 基本の対話可能な設定] で、 On Clicked () イベントを見つけます。 + アイコンを選択して、新しいイベントを追加します。 イベントを次のように構成します。

      ある。 RoverAssembly オブジェクトは、[Hierarchy] (階層) から [なし (オブジェクト)] フィールドにドラッグして、On Clicked () イベントのリスナーとして割り当てます。

      b。 [関数なし] ドロップダウン リストから TapToPlace>StartPlacement() を選択し、イベントがトリガーされたときにこのメソッドを呼び出します。

    • [ 許可された操作の種類 ] ドロップダウン リストから 、[ スケール ] チェック ボックスをオフにして、[ 移動 ] と [ 回転 ] のみが有効になるようにします。

    双方向操作の種類が構成されている Unity のスクリーンショット。

  3. RoverAssembly オブジェクトのみを選択し、 ステートフル 対話可能コンポーネント がある場合は削除します。 コンポーネントの右端にある 3 つのドットを選択し、[ コンポーネントの削除] を選択します。

  4. [プロジェクト] ウィンドウで、[ Packages>MRTK Standard Assets>Audio>HoloLens2 フォルダーに移動し、オーディオ クリップを見つけます。

    [オーディオ] フォルダーが選択されている Unity プロジェクト ウィンドウのスクリーンショット。

  5. [階層] ウィンドウで、すべての ローバー パーツ オブジェクトを再選択し、[インスペクター] ウィンドウで [ コンポーネントの追加 ] を選択して オーディオ ソース コンポーネントを追加し、次のように構成します。

    • MRTK_Scale_Startオーディオ クリップを AudioClip フィールドに割り当てます。
    • [起動時に再生] チェック ボックスをオフにします。
    • 空間ブレンド1 に変更します。

    すべてのローバー パーツが選択され、オーディオ ソース コンポーネントが追加および構成されている Unity のスクリーンショット。

  6. [階層] ウィンドウで、RoverAssembly>> オブジェクトを展開してすべての配置ヒント オブジェクトを表示し、最初のローバー パーツ RoverParts> を選択し、次のようにパーツ アセンブリ コントローラー (スクリプト) コンポーネントを構成します。

    • Camera_PlacementHint オブジェクトを [配置先] フィールドに割り当てます。

    Camera_Part の PartAssemblyController コンポーネントが構成された Unity のスクリーンショット。

  7. 残りのローバー パーツ オブジェクトと RoverAssembly オブジェクトごとに手順 5 を繰り返して、次のようにパーツ アセンブリ コントローラー (スクリプト) コンポーネントを構成します。

    • Generator_Partの場合は、Generator_PlacementHint オブジェクト[配置先] フィールドに割り当てます。
    • Lights_Partの場合は、Lights_PlacementHint オブジェクト[配置先] フィールドに割り当てます。
    • UHFAntenna_Partの場合は、UHFAntenna_PlacementHint オブジェクト[配置先] フィールドに割り当てます。
    • Spectrometer_Partの場合は、Spectrometer_PlacementHint オブジェクトを [配置先] フィールドに割り当てます。
    • RoverAssembly の場合は、オブジェクト自体、つまり同じ RoverAssembly オブジェクト[配置先] フィールドに割り当てます。
  8. [階層] ウィンドウで、RoverExplorer > Buttons >Reset ボタン オブジェクトを選択し、[インスペクター] ウィンドウで、 PressableButton.OnClicked () イベントを次のように構成します。

    • RoverAssembly オブジェクトを[なし] (オブジェクト) フィールドに割り当てます。
    • [No Function]\( 関数なし \) ドロップダウン リストから PartAssemblyController>ResetPlacement () を選択して、イベントがトリガーされたときに実行されるアクションとしてこの関数を設定します。

    リセット ボタン オブジェクト OnClick イベントが構成されている Unity のスクリーンショット。

  9. ゲーム モードに切り替える場合は、近距離または遠距離の相互作用を使用して、ローバー パーツをローバーに配置できます。 パーツが対応する配置ヒントに近づくと、パーツは所定の位置にスナップされ、ローバーの一部になります。 配置をリセットするには、[リセット] ボタンを押します。

    [リセット] ボタンが押されている Unity 再生モードの分割ビューのスクリーンショット。

境界コントロールを追加する

  1. [階層] ウィンドウで RoverExplorer オブジェクトを選択し、[インスペクター] ウィンドウで [コンポーネントの 追加 ] ボタンを使用して BoundsControl コンポーネントを追加します。 コンポーネントの横にあるチェックボックスのチェックを外して、既定で無効にします。

    RoverExplorer オブジェクトが選択され、コンポーネントが追加および無効化されている Unity のスクリーンショット。

  2. プロジェクトウィンドウで、Packages>MRTK 空間操作>BoundsControl>Prefabs フォルダーに移動し、次にBounds ControlコンポーネントのBounds Visuals Prefabフィールドに、BoundingBoxWithHandlesプレハブをクリックしてドラッグします。

    RoverExplorer オブジェクトが選択され、[Bounds Visuals Prefab] フィールドが構成されている Unity のスクリーンショット。

  3. [階層] ウィンドウで、 Menu>Buttons-GridLayout (Buttons) オブジェクトを展開して、3 つのボタンを表示します。 3 番目のボタンの名前を BoundsControl_Enableに変更し、[階層] ウィンドウで、 BoundsControl_Enable ゲーム オブジェクトを次のように構成します。

    • Frontplate > AnimatedContent > Icon > Label オブジェクトを選択し、TextMeshPro コンポーネントを [有効] に変更します。 階層内で Label オブジェクトがアクティブになっていることを確認します。
    • [なし] (オブジェクト) フィールドに RoverExplorer オブジェクトを割り当て、[関数なし] ドロップダウンから [BoundsControl>bool Enabled] を選択して、PressableButton.OnClicked() イベントを構成します (引数のチェック ボックスがオンになっていることを確認します)。
    • 小さな + アイコンを選択して、別のイベントを追加します。
    • RoverExplorer オブジェクトを [なし] (オブジェクト) フィールドに割り当てます。
    • [No Function]\( 関数なし \) ドロップダウン リスト から ObjectManipulator>bool Enabled を選択して、イベントがトリガーされたときにこのプロパティ値を更新し、 引数 のチェック ボックスがオンになっていることを確認 します
    • 小さな + アイコンを選択して、別のイベントを追加します。
    • RoverExplorer オブジェクトを [なし] (オブジェクト) フィールドに割り当てます。
    • [No Function]\( 関数なし \) ドロップダウン リストから BoundsControl>bool HandlesActive を選択し、イベントがトリガーされたときにこのプロパティ値を更新し、 引数 のチェック ボックスがオンになっていることを確認 します
    • Frontplate > AnimatedContent > Icon > UIButtonFontIcon オブジェクトを選択し、フォント アイコン セレクター コンポーネントでアイコンを四つの矢印アイコンに変更します。 これはアイコンの一覧で確認できます。または、[ 現在のアイコン名][アイコン 40] に設定します。

    BoundsControl_Enable ボタン オブジェクトが選択され、Button Config Helper コンポーネントが構成されている Unity のスクリーンショット。

  4. BoundsControl_Enable ボタンを複製してBoundsControl_Disableに名前を変更し、[インスペクター] ウィンドウで、次のようにボタン構成ヘルパー (スクリプト) コンポーネントを構成します。

    • Frontplate > AnimatedContent > Icon > Label オブジェクトを選択し、TextMeshPro コンポーネントを Disable に変更します。
    • イベントの下にあるすべてのチェック ボックスがオフになっていることを確認して、 PressableButton.OnClicked() イベントを構成 します

    ボタン オブジェクトBoundsControl_Disable選択され、Button Config Helper コンポーネントが構成されている Unity のスクリーンショット。

  5. ゲーム モードに入り、[ 有効] を選択して境界コントロールを有効にした場合は、近距離または遠距離の相互作用を使用して境界コントロールを移動、回転、スケーリングし、[ 無効] を選択して境界コントロールをもう一度無効にすることができます。

    境界コントロールが操作されている Unity 再生モードの分割ビューのスクリーンショット。