7. 旧暦モジュールサンプルアプリケーションを作成する7. Creating a Lunar Module sample application

このチュートリアルでは、前のレッスンとの複数の概念を組み合わせて、独自のサンプルエクスペリエンスを作成します。In this tutorial, multiple concepts are combined from previous lessons to create a unique sample experience. パートアセンブリアプリケーションを作成する方法を学習します。このアプリケーションでは、ユーザーが追跡したハンドを使用して部品を取り出し、旧暦モジュールを組み立てる必要があります。You will learn how to create a part assembly application whereby a user needs to use tracked hands to pick up parts and attempt to assemble a lunar module. Pressable ボタンを使用して、配置ヒントのオンとオフを切り替えたり、エクスペリエンスをリセットしたり、旧暦モジュールをスペースで起動したりします。You will use pressable buttons to toggle placement hints on and off, to reset the experience, and to launch the lunar module into space!

今後のチュートリアルでは、このエクスペリエンスの構築を継続します。これには、空間の配置に Azure 空間アンカーを利用する強力なマルチユーザーのユースケースが含まれます。In future tutorials, you will continue to build upon this experience, which includes powerful multi-user use cases that leverage Azure Spatial Anchors for spatial alignment.

目標Objectives

  • 前のレッスンの複数の概念を組み合わせて固有のエクスペリエンスを作成するCombine multiple concepts from previous lessons to create a unique experience
  • オブジェクトを切り替える方法を学習するLearn how to toggle objects
  • 押しボタンを使用して複雑なイベントをトリガーするTrigger complex events using pressable buttons
  • 剛体の物理学と力を使用するUse rigidbody physics and forces
  • ヒントの使用を調査するExplore the use of tool tips

旧暦モジュールパーツの概要Lunar Module Parts overview

このセクションでは、簡単なパートアセンブリチャレンジを作成します。ユーザーの目標は、テーブルに展開される5つの部分を太陰暦モジュールの正しい位置に配置することです。In this section, you will create a simple part assembly challenge where the user's goal is to place five parts that are spread out on the table at the correct location on the Lunar Module.

これを実現するには、主に次の手順を実行します。The main steps you will take to achieve this are:

  1. ロケットランチャー prefab をシーンに追加するAdd the Rocket Launcher prefab to the scene
  2. すべての部分に対してオブジェクトの操作を有効にするEnable object manipulation for all the parts
  3. パーツアセンブリのデモ (スクリプト) コンポーネントを追加して構成するAdd and configure the Part Assembly Demo (Script) component

注意

パートアセンブリデモ (スクリプト) コンポーネントは、MRTK の一部ではありません。The Part Assembly Demo (Script) component is not part of MRTK. このチュートリアルでは、このチュートリアルのアセットを提供しました。It was provided with this tutorial's assets.

1. ロケットランチャー prefab をシーンに追加する1. Add the Rocket Launcher prefab to the scene

プロジェクト ウィンドウで、アセット > mrtk に移動します。チュートリアル: GettingStarted Prefabs > RocketLauncherフォルダーに移動し、 RocketLauncher prefab を 階層 ウィンドウにドラッグしてシーンに追加した後、適切な場所に配置します。次に例を示します。 > In the Project window, navigate to the Assets > MRTK.Tutorials.GettingStarted > Prefabs > RocketLauncher folder, drag the RocketLauncher prefab into the Hierarchy window to add it to your scene, and then position it at a suitable location, for example:

  • 変換位置 X = 1.5、Y =-0.4、Z = 0 の場合、ユーザーの右側にウェスト height で配置されます。Transform Position X = 1.5, Y = -0.4, Z = 0, so it is positioned to the right of the user at waist height
  • 変換の回転 X = 0、Y = 180、Z = 0、エクスペリエンスの主な機能はユーザーにとってTransform Rotation X = 0, Y = 180, Z = 0, so the main features of the experience faces the user

mrlearning-base

2. すべての部分に対してオブジェクトの操作を有効にします。2. Enable object manipulation for all the parts

[階層] ウィンドウで、RocketLauncher > Lunarmodulepartsオブジェクトを見つけてすべての子オブジェクトを選択し、操作ハンドラー (スクリプト) コンポーネントとNear Grabbable (スクリプト) コンポーネントを追加して、操作ハンドラー (スクリプト) を次のように構成します。In the Hierarchy window, locate the RocketLauncher > LunarModuleParts object and select all the child objects, add the Manipulation Handler (Script) component and the Near Interaction Grabbable (Script) component, and then configure the Manipulation Handler (Script) as follows:

  • 2 つのきき操作の種類を移動回転に変更して、スケーリングが無効になるようにします。Change Two Handed Manipulation Type to Move Rotate so scaling is disabled
  • [遠隔操作を許可する] チェックボックスをオフにして、ほぼ対話のみを許可します。Un-check the Allow Far Manipulation checkbox to only allow near interaction

mrlearning-base

ヒント

オブジェクトの操作を実装する方法に関する詳細な手順については、「 3D オブジェクトの操作」の指示を参照してください。For a reminder, with step by step instructions, on how to implement object manipulation, you can refer to the Manipulating 3D Objects instructions.

3. パーツアセンブリのデモ (スクリプト) コンポーネントを追加して構成する3. Add and configure the Part Assembly Demo (Script) component

すべての LunarModuleParts 子オブジェクトを選択したまま、オーディオソースコンポーネントを追加し、次のように構成します。With all the LunarModuleParts child objects still selected, add an Audio Source component and then configure it as follows:

  • 適切なオーディオクリップをaudioclipフィールドに割り当てます (たとえば、MRKT_Scale_StartAssign a suitable audio clip to the AudioClip field, for example, MRKT_Scale_Start
  • シーンの読み込み時にオーディオクリップが自動的に再生されないように、 [スリープ状態で再生] チェックボックスをオフにします。Un-check the Play On Awake checkbox, so the audio clip does not automatically play when the scene loads
  • 空間Blendを1に変更して、空間オーディオを有効にするChange Spatial Blend to 1, to enable spatial audio

mrlearning-base

すべての LunarModuleParts 子オブジェクトがまだ選択されている状態で、 Part Assembly Demo (スクリプト) コンポーネントを追加します。With all the LunarModuleParts child objects still selected, add the Part Assembly Demo (Script) component:

mrlearning-base

[階層] ウィンドウで、 Roverenclosure クロージャオブジェクトを選択し、そのパートアセンブリデモ (スクリプト) コンポーネントを次のように構成します。In the Hierarchy window, select the RoverEnclosure object and configure its Part Assembly Demo (Script) component as follows:

  • フィールドを配置するオブジェクトに対して、オブジェクト自体 (この場合はroverenclosure クロージャオブジェクト) を割り当てます。To the Object To Place field, assign the object itself, in this case, the RoverEnclosure object
  • [場所] フィールドに、対応する PlacementHints オブジェクト (この例ではRoverEnclosure_PlacementHintsオブジェクト) を割り当てます。To the Location To Place field, assign the corresponding PlacementHints object, in this case, the RoverEnclosure_PlacementHints object
  • ツールヒントオブジェクトフィールドに、対応する ToolTipObject (この例ではRoverEnclosure_ToolTipオブジェクト) を割り当てます。To the Tool Tip Object field, assign the corresponding ToolTipObject, in this case, the RoverEnclosure_ToolTip object
  • [オーディオソース] フィールドに、オブジェクト自体 (この場合はroverenclosure クロージャオブジェクト) を割り当てます。To the Audio Source field, assign the object itself, in this case, the RoverEnclosure object

mrlearning-base

他のすべての LunarModuleParts 子オブジェクト (つまり、Futex、EnergyCell、DockingPortal、ExternalSensor) に対して繰り返します。Repeat for each of the other LunarModuleParts child objects, i.e. FuelTank, EnergyCell, DockingPortal, and ExternalSensor.

ここでゲームモードに入り、' オブジェクト ' を移動して、それに対応する ' Location ' の位置に近い場所に配置すると、次のことがわかります。If you now enter Game mode and move an 'Object To Place' close to it's corresponding 'Location To Place' you will notice:

  • オブジェクトが配置され、LunarModule オブジェクトの親になります。これにより、オブジェクトが旧暦モジュールの一部になります。The object will snap into place and be parented under the LunarModule object so it becomes part of the Lunar Module
  • オブジェクトのオーディオソースは、オブジェクトの位置で割り当てられたオーディオクリップを再生します。The Audio Source on the object will play the assigned Audio Clip at the location of the object
  • 対応するツールヒントオブジェクトは非表示になりますThe corresponding Tool Tip object will be hidden

mrlearning-base

ヒント

エディター内入力シミュレーションの使用方法に関する注意事項については、「エディターでの入力シミュレーションを使用して、 Mrtk ドキュメントポータルでシーンガイドをテストする」を参照してください。For a reminder on how to use the in-editor input simulation, you can refer to the Using the In-Editor Hand Input Simulation to test a scene guide in the MRTK Documentation Portal.

月着陸船の構成Configuring the Lunar Module

このセクションでは、ユーザーが次のことができるように、ロケットランチャーアプリケーションに機能を追加します。In this section, you will add additional features to the Rocket Launcher application so the user can:

  • 旧暦モジュールとの対話Interact with the Lunar Module
  • 旧暦モジュールをスペースで起動し、起動時にサウンドを再生します。Launch the Lunar Module into space and play a sound when it is launched
  • 旧暦モジュールとすべての部分が元の位置に戻されるようにアプリケーションをリセットします。Reset the application so the Lunar Module and all the part are placed back to their original position
  • パーツアセンブリのチャレンジをより困難にするために配置ヒントを非表示にします。Hide the placement hints to make the part assembly challenge more difficult.

これを実現するには、主に次の手順を実行します。The main steps you will take to achieve this are:

  1. オブジェクトの操作を有効にするEnable object manipulation
  2. 物理を有効にするEnable physics
  3. オーディオソースコンポーネントを追加するAdd an Audio Source component
  4. Launch 旧暦モジュール (スクリプト) コンポーネントの追加と構成Add and configure the Launch Lunar Module (Script) component
  5. 配置ヒントの切り替え (スクリプト) コンポーネントの追加と構成Add and configure the Toggle Placement Hints (Script) component

注意

[旧暦モジュール (スクリプト)] コンポーネントと [配置ヒントの切り替え (スクリプト)] コンポーネントは、MRTK の一部ではありません。The Launch Lunar Module (Script) component and the Toggle Placement Hints (Script) component are not part of MRTK. これらは、このチュートリアルの資産で提供されています。They were provided with this tutorial's assets.

1. オブジェクトの操作を有効にする1. Enable object manipulation

[階層] ウィンドウで、RocketLauncher > Lunarmoduleオブジェクトを選択し、操作ハンドラー (スクリプト) コンポーネントとNear Grabbable (スクリプト) コンポーネントを追加して、操作ハンドラー (スクリプト) を次のように構成します。In the Hierarchy window, select the RocketLauncher > LunarModule object, add the Manipulation Handler (Script) component and the Near Interaction Grabbable (Script) component, and then configure the Manipulation Handler (Script) as follows:

  • 2 つのきき操作の種類を移動回転に変更して、スケーリングが無効になるようにします。Change Two Handed Manipulation Type to Move Rotate so scaling is disabled
  • [遠隔操作を許可する] チェックボックスをオフにして、ほぼ対話のみを許可します。Un-check the Allow Far Manipulation checkbox to only allow near interaction

mrlearning-base

2. 物理を有効にする2. Enable physics

RocketLauncher > Lunarmoduleオブジェクトを選択したまま、Rigidbody コンポーネントを追加し、次のように構成します。With the RocketLauncher > LunarModule object still selected, add a Rigidbody component and then configure it as follows:

  • [重力を使用する] チェックボックスをオフにして、太陰暦モジュールが重力の影響を受けないようにします。Un-check the Use Gravity checkbox so the Lunar Module is not affected by gravity
  • [Is キネマティック] チェックボックスをオンにします。これにより、旧暦モジュールは、physic の強制による影響を受けません。Check the Is Kinematic checkbox so the Lunar Module initially isn't affected by physic forces

mrlearning-base

3. オーディオソースコンポーネントを追加する3. Add an Audio Source component

RocketLauncher > Lunarmoduleオブジェクトを選択したまま、オーディオソースコンポーネントを追加し、次のように構成します。With the RocketLauncher > LunarModule object still selected, add an Audio Source component and then configure it as follows:

  • 空間Blendを1に変更して空間オーディオを有効にするChange Spatial Blend to 1 to enable spatial audio

mrlearning-base

4. Launch Module (スクリプト) コンポーネントを追加して構成する4. Add and configure the Launch Lunar Module (Script) component

RocketLauncher > Lunarmoduleオブジェクトを選択した状態で、 Launch 旧暦モジュール (スクリプト) コンポーネントを追加し、次のように構成します。With the RocketLauncher > LunarModule object still selected, add the Launch Lunar Module (Script) component and then configure it as follows:

  • 推力の値を変更して、旧暦を起動したときに (たとえば、0.01 に)、旧暦のモジュールが適切に表示されるようにします。Change Thrust value so the Lunar Module will fly up gracefully when launched, for example, to 0.01

mrlearning-base

5. 配置ヒントの切り替え (スクリプト) コンポーネントを追加および構成する5. Add and configure the Toggle Placement Hints (Script) component

RocketLauncher > Lunarmoduleオブジェクトを選択したまま、 [配置ヒント (スクリプト) の切り替え] コンポーネントを追加し、次のように構成します。With the RocketLauncher > LunarModule object still selected, add the Toggle Placement Hints (Script) component and then configure it as follows:

  • Game オブジェクトの配列サイズプロパティを5に設定します。Set the Game Object Array Size property to 5
  • PlacementHintsオブジェクトの各子オブジェクトを、Game オブジェクト配列の要素フィールドに割り当てます。Assign each of the PlacementHints object's child objects to the an Element field in the Game Object Array:

mrlearning-base

[起動] ボタンの構成Configuring the Launch button

[階層] ウィンドウで、[> RocketLauncher] ボタン > launchbuttonオブジェクトを選択し、[ Pressable] ボタン (スクリプト) コンポーネントで新しいボタン押された () イベントを作成して、イベントを受信するためのlunarmoduleオブジェクトを構成し、トリガーするアクションとしてlaunchlunarStartThrusterを定義します。In the Hierarchy window, select the RocketLauncher > Buttons > LaunchButton object, then on the Pressable Button (Script) component, create a new Button Pressed () event, configure the LunarModule object to receive the event, and define LaunchLunarModule.StartThruster as the action to be triggered:

mrlearning-base

ヒント

イベントの実装方法に関する注意事項については、「ハンドトラッキングジェスチャ」と「対話型 buttons 」を参照してください。For a reminder on how to implement events, you can refer to the Hand tracking gestures and interactable buttons instructions.

RocketLauncher > ボタン > launchbuttonオブジェクトが選択された状態で、[ Pressable] ボタン (スクリプト) コンポーネントで、新しいButton 押された () イベントを作成し、イベントを受信するようにlunarmoduleオブジェクトを構成し、トリガーするアクションとしてaudiosource. PlayOneShotを定義し 、オーディオクリップフィールドに適切 MRTK_Gem なオーディオクリップを割り当てますWith the RocketLauncher > Buttons > LaunchButton object still selected, on the Pressable Button (Script) component, create a new Button Pressed () event, configure the LunarModule object to receive the event, define AudioSource.PlayOneShot as the action to be triggered, and assign a suitable audio clip to the Audio Clip field, for example, the MRTK_Gem audio clip:

mrlearning-base

RocketLauncher > ボタン > launchbuttonオブジェクトが選択された状態で、[ Pressable] ボタン (スクリプト) コンポーネントで新しいタッチ終了 () イベントを作成し、イベントを受信するようにlunarmoduleオブジェクトを構成して、トリガーされるアクションとしてlaunchlunarmodule. StopThrusterを定義します。With the RocketLauncher > Buttons > LaunchButton object still selected, on the Pressable Button (Script) component, create a new Touch Ended () event, configure the LunarModule object to receive the event, and define LaunchLunarModule.StopThruster as the action to be triggered:

mrlearning-base

これでゲームモードに入り、[起動] ボタンを押すと、オーディオクリップが再生されます。また、[起動] ボタンを1秒以上押したままにすると、旧暦モジュールがスペースで起動していることがわかります。If you now enter Game mode and press the Launch button, you will hear the audio clip play, and if you hold the Launch button down for about a second or longer, you will see the Lunar Module launch into space:

mrlearning-base

[リセット] ボタンの構成Configuring the Reset button

[階層] ウィンドウで、[RocketLauncher >] ボタン > Resetbuttonオブジェクトを選択し、[ Pressable] ボタン (スクリプト) コンポーネントで新しいButton 押された () イベントを作成します。次に、イベントを受信するためのlunarmoduleオブジェクトを構成し、トリガーするアクションとしてlaunchlunarmodule. resetbuttonを定義します。In the Hierarchy window, select the RocketLauncher > Buttons > ResetButton object, then on the Pressable Button (Script) component, create a new Button Pressed () event, configure the LunarModule object to receive the event, and define LaunchLunarModule.ResetModule as the action to be triggered:

mrlearning-base

RocketLauncher > のボタン > resetbuttonオブジェクトを選択したまま、[ Pressable] ボタン (スクリプト) コンポーネントで、新しいButton 押された () イベントを作成し、イベントを受信するようにRocketLauncherオブジェクトを構成し、トリガーするアクションとしてBroadcastMessageを定義し、メッセージフィールドにresetbuttonを入力します。With the RocketLauncher > Buttons > ResetButton object still selected, on the Pressable Button (Script) component, create a new Button Pressed () event, configure the RocketLauncher object to receive the event, define GameObject.BroadcastMessage as the action to be triggered, and enter ResetPlacement in message field:

mrlearning-base

ヒント

BroadcastMessage アクションは、ResetPlacement メッセージを RocketLauncher オブジェクトからすべての子オブジェクトに送信します。The GameObject.BroadcastMessage action sends the ResetPlacement message from the RocketLauncher object to all its child object. すべての LunarModuleParts 子オブジェクトに追加したパーツアセンブリデモ (スクリプト) コンポーネントで定義されている ResetPlacement 関数を持つ子オブジェクトは、その子オブジェクトの配置をリセットする ResetPlacement 関数を呼び出します。Any child object that has the ResetPlacement function, which is defined in the Part Assembly Demo (Script) component you added to all the LunarModuleParts child object, will invoke the ResetPlacement function which resets that child object's placement.

これでゲームモードに入り、[リセット] ボタンを押すと、再生中のオーディオクリップが表示され、スペースで開かれている旧暦が表示されます。If you now enter Game mode and press the Reset button you will hear the audio clip being played and see the Lunar Module being launched into space:

mrlearning-base

配置ヒントボタンの構成Configuring the Placement Hints button

[階層] ウィンドウで、[RocketLauncher > ボタン > Hintsbutton] オブジェクトを選択し、[ Pressable] ボタン (スクリプト) コンポーネントで新しいボタン押された () イベントを作成します。次に、イベントを受信するためのlunarmoduleオブジェクトを構成し、トリガーされるアクションをTogglePlacementHintsに定義します。In the Hierarchy window, select the RocketLauncher > Buttons > HintsButton object, then on the Pressable Button (Script) component, create a new Button Pressed () event, configure the LunarModule object to receive the event, and define TogglePlacementHints.ToggleGameObjects the action to be triggered:

mrlearning-base

これでゲームモードに入ると、半透明の配置ヒントが既定で無効になっていることがわかりますが、ヒントボタンを押すことによって、オンとオフを切り替えることができます。If you now enter Game mode you will notice that the translucent placement hints are disabled by default, but that you can toggle them on and off by pressing the Hints button:

mrlearning-base

結論Congratulations

このアプリケーションは完全に構成されています。You have fully configured this application. これで、アプリケーションでは、ユーザーが旧暦モジュールを完全に組み立て、旧暦モジュールを起動し、ヒントを切り替えることができるようになりました。また、アプリケーションをリセットして再起動することもできます。Now, your application allows users to fully assemble the Lunar Module, launch the Lunar Module, toggle hints, and reset the application to start again.