演習 - 境界コントロールを使用して 3D オブジェクトを操作する
ObjectManipulator
スクリプトは、1 つまたは 2 つの手を使用してオブジェクトを移動可能でスケーラブルで回転可能にします。 このスクリプトは、ユーザーが手でホログラムに直接触れることを可能にするため、直接操作入力モデルをサポートしています。 ここでは、 ObjectManipulator
を使用して手動操作を有効にして、ローバー エクスプローラーを移動、スケーリング、回転できるようにします。
さらに、ローバー エクスプローラーを構成して、ローバー パーツを Rover に配置して、完全な Rover アセンブリにします。 [階層] ウィンドウで、RoverExplorer >RoverParts オブジェクトを展開し、すべての子ローバー パーツ オブジェクトと RoverAssembly オブジェクトを選択し、[インスペクター] ウィンドウで [ コンポーネントの追加 ] ボタンを使用して、選択したすべてのオブジェクトに次のコンポーネントを追加します。
- オブジェクト マニピュレーター (スクリプト) コンポーネント
- パーツ アセンブリ コントローラー (スクリプト) コンポーネント
すべてのローバー パーツ オブジェクトと RoverAssembly オブジェクトが選択された状態で、[インスペクター] ウィンドウで、 オブジェクト マニピュレーター (スクリプト) コンポーネントを次のように構成します。
[ 基本の対話可能な設定] で、 On Clicked () イベントを見つけます。 + アイコンを選択して、新しいイベントを追加します。 イベントを次のように構成します。
ある。 RoverAssembly オブジェクトは、[Hierarchy] (階層) から [なし (オブジェクト)] フィールドにドラッグして、On Clicked () イベントのリスナーとして割り当てます。
b。 [関数なし] ドロップダウン リストから TapToPlace>StartPlacement() を選択し、イベントがトリガーされたときにこのメソッドを呼び出します。
[ 許可された操作の種類 ] ドロップダウン リストから 、[ スケール ] チェック ボックスをオフにして、[ 移動 ] と [ 回転 ] のみが有効になるようにします。
RoverAssembly オブジェクトのみを選択し、 ステートフル 対話可能コンポーネント がある場合は削除します。 コンポーネントの右端にある 3 つのドットを選択し、[ コンポーネントの削除] を選択します。
[プロジェクト] ウィンドウで、[ Packages>MRTK Standard Assets>Audio>HoloLens2 フォルダーに移動し、オーディオ クリップを見つけます。
[階層] ウィンドウで、すべての ローバー パーツ オブジェクトを再選択し、[インスペクター] ウィンドウで [ コンポーネントの追加 ] を選択して オーディオ ソース コンポーネントを追加し、次のように構成します。
- MRTK_Scale_Startオーディオ クリップを AudioClip フィールドに割り当てます。
- [起動時に再生] チェック ボックスをオフにします。
- 空間ブレンドを 1 に変更します。
[階層] ウィンドウで、RoverAssembly>> オブジェクトを展開してすべての配置ヒント オブジェクトを表示し、最初のローバー パーツ RoverParts> を選択し、次のようにパーツ アセンブリ コントローラー (スクリプト) コンポーネントを構成します。
- Camera_PlacementHint オブジェクトを [配置先] フィールドに割り当てます。
残りのローバー パーツ オブジェクトと RoverAssembly オブジェクトごとに手順 5 を繰り返して、次のようにパーツ アセンブリ コントローラー (スクリプト) コンポーネントを構成します。
- Generator_Partの場合は、Generator_PlacementHint オブジェクトを [配置先] フィールドに割り当てます。
- Lights_Partの場合は、Lights_PlacementHint オブジェクトを [配置先] フィールドに割り当てます。
- UHFAntenna_Partの場合は、UHFAntenna_PlacementHint オブジェクトを [配置先] フィールドに割り当てます。
- Spectrometer_Partの場合は、Spectrometer_PlacementHint オブジェクトを [配置先] フィールドに割り当てます。
- RoverAssembly の場合は、オブジェクト自体、つまり同じ RoverAssembly オブジェクトを [配置先] フィールドに割り当てます。
[階層] ウィンドウで、RoverExplorer > Buttons >Reset ボタン オブジェクトを選択し、[インスペクター] ウィンドウで、 PressableButton.OnClicked () イベントを次のように構成します。
- RoverAssembly オブジェクトを[なし] (オブジェクト) フィールドに割り当てます。
- [No Function]\( 関数なし \) ドロップダウン リストから PartAssemblyController>ResetPlacement () を選択して、イベントがトリガーされたときに実行されるアクションとしてこの関数を設定します。
ゲーム モードに切り替える場合は、近距離または遠距離の相互作用を使用して、ローバー パーツをローバーに配置できます。 パーツが対応する配置ヒントに近づくと、パーツは所定の位置にスナップされ、ローバーの一部になります。 配置をリセットするには、[リセット] ボタンを押します。
境界コントロールを追加する
[階層] ウィンドウで RoverExplorer オブジェクトを選択し、[インスペクター] ウィンドウで [コンポーネントの 追加 ] ボタンを使用して BoundsControl コンポーネントを追加します。 コンポーネントの横にあるチェックボックスのチェックを外して、既定で無効にします。
プロジェクトウィンドウで、Packages>MRTK 空間操作>BoundsControl>Prefabs フォルダーに移動し、次にBounds ControlコンポーネントのBounds Visuals Prefabフィールドに、BoundingBoxWithHandlesプレハブをクリックしてドラッグします。
[階層] ウィンドウで、 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 ボタンを複製してBoundsControl_Disableに名前を変更し、[インスペクター] ウィンドウで、次のようにボタン構成ヘルパー (スクリプト) コンポーネントを構成します。
- Frontplate > AnimatedContent > Icon > Label オブジェクトを選択し、TextMeshPro コンポーネントを Disable に変更します。
- イベントの下にあるすべてのチェック ボックスがオフになっていることを確認して、 PressableButton.OnClicked() イベントを構成 します。
ゲーム モードに入り、[ 有効] を選択して境界コントロールを有効にした場合は、近距離または遠距離の相互作用を使用して境界コントロールを移動、回転、スケーリングし、[ 無効] を選択して境界コントロールをもう一度無効にすることができます。