演習 - 境界コントロールを使用して 3D オブジェクトを操作する
ObjectManipulator スクリプトを使用すると、片手または両手を使用してオブジェクトを移動、拡大縮小、回転できるようになる。 このスクリプトでは、ユーザーが自分の手でホログラムを直接操作できるように、直接操作入力モデルがサポートされます。 ここでは、ObjectManipulator を使って、手による操作を有効にし、ローバー エクスプローラーを移動、拡大縮小、回転できるようにします。
さらに、ローバーのパーツをローバーに配置して、ローバーを完全に組み立てられるように、ローバー エクスプローラーを構成します。 [階層] ペインで、RoverExplorer >RoverParts オブジェクトを展開し、そのすべての子ローバー パーツ オブジェクトと RoverAssembly オブジェクトを選択したら、[インスペクター] ペインで、[コンポーネントの追加] ボタンを使用して、選択したすべてのオブジェクトに次のコンポーネントを追加します。
- Object Manipulator (Script) コンポーネント
- Part Assembly Controller (Script) コンポーネント
すべてのローバー パーツ オブジェクトと RoverAssembly オブジェクトを選んだまま、[Inspector](インスペクター) ペインで Object Manipulator (Script) コンポーネントを次のように構成します。
[Base Interactable Settings] (対話可能な基本設定) で、On Clicked () イベントを見つけます。 + アイコンを選択して、新しいイベントを追加します。 イベントを次のように構成します。
a. RoverAssembly オブジェクトは、[Hierarchy] (階層) から [なし (オブジェクト)] フィールドにドラッグして、On Clicked () イベントのリスナーとして割り当てます。
b. [関数なし] ドロップダウン リストから TapToPlace>StartPlacement() を選択し、イベントがトリガーされたときにこのメソッドを呼び出します。
[Allowed Manipulation Type] (許可された操作タイプ) ドロップダウン リストで、[Scale] (拡大縮小) チェック ボックスをオフにし、[Move] (移動) と [Rotate] (回転) だけを有効にします。
RoverAssembly オブジェクトのみを選択し、Stateful Interactable コンポーネントがある場合は削除します。 コンポーネントの右端にある 3 つのドットを選択し、[コンポーネントの削除] を選択します。
[プロジェクト] ペインで、[パッケージ]>[MRTK Standard Assets] (MRTK 標準アセット)>[Audio] (オーディオ)>HoloLens2 フォルダーに移動して、オーディオ クリップを見つけます。
[Hierarchy](階層) ペインですべてのローバー パーツ オブジェクトを再び選んでから、[Add Component](コンポーネントの追加) を選んで Audio Sources コンポーネントを追加して、それを次のように構成します。
- MRTK_Scale_Start オーディオ クリップを AudioClip フィールドに割り当てます
- [Play On Awake](起動時に再生) チェックボックスをオフにします
- [Spatial Blend](空間ブレンド) を 1 に変更します
[階層] ペインで、RoverAssembly > RoverModel_PlacementHints_XRay >Parts_PlacementHints オブジェクトを展開して、すべての配置ヒント オブジェクトを表示してから、最初のローバー パーツ RoverParts >Camera_Part を選択し、Part Assembly Controller (Script) コンポーネントを次のように構成します。
- Camera_PlacementHint オブジェクトを [Location To Place](配置する場所) フィールドに割り当てます
残りの各ローバー パーツ オブジェクトと RoverAssembly オブジェクトにステップ 5 を繰り返し、Part Assembly Controller (Script) コンポーネントを次のように構成します。
- Generator_Part では、Generator_PlacementHint オブジェクトを [Location To Place](配置する場所) フィールドに割り当てます
- Lights_Part では、Lights_PlacementHint オブジェクトを [Location To Place](配置する場所) フィールドに割り当てます
- UHFAntenna_Part では、UHFAntenna_PlacementHint オブジェクトを [Location To Place](配置する場所) フィールドに割り当てます
- Spectrometer_Part については、Spectrometer_PlacementHint オブジェクトを [Location To Place](配置する場所) フィールドに割り当てます
- RoverAssembly では、オブジェクトそれ自体、つまり同じ RoverAssembly オブジェクトを [Location To Place](配置する場所) フィールドに割り当てます
[階層] ペインで、RoverExplorer > Buttons >Reset ボタン オブジェクトを選択し、[インスペクター] ペインで、PressableButton OnClicked () イベントを次のように構成します。
- RoverAssembly オブジェクトを [None (Object)](なし (オブジェクト)) フィールドに割り当てます
- [No Function](関数なし) ドロップダウン リストで PartAssemblyController>ResetPlacement () を選び、この関数をイベントがトリガーされたときに実行するアクションとして設定します
これでゲーム モードに切り替えると、近くまたは遠くの対話式操作を使って、ローバー パーツをローバーに配置できます。 パーツは、対応する配置ヒントに近づくと、自動的に所定の位置にはめ込まれ、Rover の一部になります。 配置をリセットする場合は、[リセット] ボタンを押すことができます。
境界コントロールを追加する
階層ウィンドウで、RoverExplorer オブジェクトを選択します。その後、[インスペクター] ウィンドウで、[コンポーネントの追加] ボタンを使用して、BoundsControl コンポーネントを追加します。 コンポーネントの横にあるチェック ボックスをオフにして、既定で無効にします。
[プロジェクト] ウィンドウで、[パッケージ]>[MRTK 空間操作]>[BoundsControl]>[プレハブ] フォルダーに移動し、BoundingBoxWithHandles プレハブをクリックして、[境界コントロール] コンポーネントの [Bounds Visuals Prefab] フィールドにドラッグします。
階層ペインで、Menu >Buttons-GridLayout (Buttons) オブジェクトを展開し、3 つのボタンを表示して、3 つ目のボタンの名前を BoundsControl_Enable に変更します。次に、階層ウィンドウで、BoundsControl_Enable ゲーム オブジェクトを次のように構成します。
- Frontplate > AnimatedContent > Icon > Label オブジェクトを選択し、TextMeshPro コンポーネントを [有効] に変更します。 階層内で Label オブジェクトがアクティブになっていることを確認します
- [なし] (オブジェクト) フィールドに RoverExplorer オブジェクトを割り当てて、[関数なし] ドロップダウンから [BoundsControl]>[bool Enabled] (bool 有効) を選択して、PressableButton.OnClicked() イベントを構成します (引数のチェックボックスがオンになっていることを確認してください)
- 小さい [+] アイコンを選んで、別のイベントを追加します
- RoverExplorer オブジェクトを [None (Object)](なし (オブジェクト)) フィールドに割り当てます
- [関数なし] ドロップダウン リストで ObjectManipulator>[bool Enabled] (bool 有効) を選んで、イベントがトリガーされたらこのプロパティ値を更新し、引数チェックボックスがオンになっていることを確認します
- 小さい [+] アイコンを選んで、別のイベントを追加します
- RoverExplorer オブジェクトを [None (Object)](なし (オブジェクト)) フィールドに割り当てます
- [関数なし] ドロップダウン リストで BoundsControl>[bool HandlesActive] を選んで、イベントがトリガーされたらこのプロパティ値を更新し、引数チェックボックスがオンになっていることを確認します
- Frontplate > AnimatedContent > Icon > UIButtonFontIcon オブジェクトを選択し、[アイコン] を [Font Icon Selector] (フォント アイコン セレクター) コンポーネントの 4 つの矢印アイコンに変更します。 これはアイコンの一覧にあるか、[現在のアイコン名] を [アイコン 40] に設定します
BoundsControl_Enable ボタンを複製し、名前を BoundsControl_Disable に変更し、[インスペクター] ペインで、[ボタン構成ヘルパー (スクリプト)] コンポーネントを次のように構成します。
- Frontplate > AnimatedContent > Icon > Label オブジェクトを選択し、TextMeshPro コンポーネントを [無効] に変更します。
- イベントの下にあるすべてのチェック ボックスがオフになっていることを確認して、PressableButton.OnClicked() イベントを構成します
ここでゲーム モードに切り替え、[Enable](有効) を選んで境界コントロールを有効にすると、近くまたは遠くの対話式操作を使って境界コントロールの移動、回転、拡大縮小を行うことができ、[Disable](無効) を選択すると境界コントロールが再び無効になります。