Mesh 101 チュートリアル 第 3 章: Mesh Visual Scripting を使用してインタラクティビティを追加する
Note
Mesh ツールキットは定期的に更新されており、このビデオには最新の変更のすべては反映されていない場合があります。 この記事の内容は、信頼できる情報源として見なすべきものです。
セットアップ フェーズが完了したので、次は GameObjects をインタラクティブにしましょう。 この章では、Mesh Visual Scripting について説明します。これを使用して、環境にカスタム ロジックを追加できます。
Note
Mesh Scripting には、C# コードを使用する Mesh Cloud Scripting と、スクリプト グラフを作成した後、ノード (ユニットともいいます) をシーケンスに追加してコーディング ロジックを作成する Mesh Visual Scripting の 2 種類があります。 このバージョンの Mesh 101 チュートリアルでは、Mesh Visual Scripting を使用します。以前のバージョンでは Mesh Cloud Scripting を使用していました。
Mesh Scripting はすべての環境に必要なわけではありませんが、ここで追加する機能 (ボタンをインタラクティブにする、情報テキスト ポップアップをトリガーする、シーン内をテレポートする) で必要になります。
ステーション 3.1: 対話可能なボタンを作成する
最初のタスクでは、アバターによって押されたときにビデオを再生するボタンを作成します。 そして、アバターは同じボタンを押してビデオを停止できます。
- [Scene] ウィンドウで、第 3 章のステーションを含む球体テラスに移動し、次に示すように、最初のステーションである「3.1 -- ビデオ再生」が見えるようにビューを調整します。
ご覧のように、ビデオ画面は既に配置されていますが、再生/停止ボタンが必要です。 ステーションのテキスト ボックスで説明されているように、ボタンを使用して VideoPlayer のオンとオフを切り替え、ボタンのテキストを変更できるように、何らかのボタン ロジックを含むスクリプト グラフを作成します。
ボタンをシーンに追加する
Unity で、Chapter3 という名前の GameObject と 3.1 - Video という名前の子オブジェクトが展開されていることを確認します。
[Project] (プロジェクト) ウィンドウで、ButtonBase プレハブを検索します。 [Search] (検索) フィルターでは必ず [ALL] (すべて) を選択してください。
ButtonBase を [Project] (プロジェクト) ウィンドウからドラッグし、[Hierarchy] (階層) で 3.1 -- Video という名前の GameObject にドロップし、ButtonBase が 3.1 -- Video の子として配置されるようにします。
ButtonBase の [Transform] (変換) - [Position] (位置) の値が 0、0、0 であることを確認します。
ButtonBase は、シーン内で必要な場所よりも少し低い場所に配置されます。 これを修正してみましょう。
[Hierarchy] (階層) で ButtonBase が選択されていることを確認します。
[Inspector] (インスペクター) で、[Transform] (変換) - [Position] (位置) - [Y] の値を "1" に変更します。
完璧です。 ButtonBase がビデオ画面のすぐ下に正しく配置されました。
ボタンの名前を変更する
ButtonBase を選択した状態で、[Inspector] (インスペクター) で ButtonBase の名前を "PlayVideoButton" に変更します。
ボタンのラベルを変更する
現時点では、ボタンのテキストに "Label" と表示されます。 これを "Play" に変更しましょう。
[Hierarchy] (階層) で、PlayVideoButton GameObject を展開してその子オブジェクト Button を表示し、Button を展開してその子オブジェクトを表示し、Label 子オブジェクトを選択します。
[Inspector] (インスペクター) で、[TextMeshPro -- Text] コンポーネントに移動し、[Text Input] (テキスト入力) ボックスでテキストを "Play" に変更します。
ボタンのビジュアル スクリプトを作成する
[Hierarchy] (階層) で、PlayVideoButton が選択されていることを確認します。
[Inspector] (インスペクター) で [Add Component] (コンポーネントの追加) をクリックし、[Script Machine] (スクリプト マシン) を選択します。
[Inspector] (インスペクター) に、[Script Machine] (スクリプト マシン) と [Variables] (変数) という 2 つの新しいコンポーネントが追加されていることに注意してください。 [Inspector] (インスペクター) の下部に "Mesh Visual Scripting Diagnostics" という名前の新しいウィンドウもあります。 このウィンドウには、ビジュアル スクリプトに関するフィードバックが表示され、トラブルシューティングに役立ちます。
[Script Machine] (スクリプト マシン) コンポーネントでは、[Source] (ソース) オプションが [Graph] (グラフ) に設定されていることに注意してください。 [Source] (ソース) には、[Graph] (グラフ) と [Embed] (埋め込み) の 2 つの選択肢があります。 それぞれに長所と短所があります。 グラフ スクリプトは別のファイルとして保存されるため、スクリプトには [Graph] (グラフ) を選択します。こうすることで、柔軟性が向上します。
ヒント
[Graph] (グラフ) と [Embed] (埋め込み) については、Unity の Script Machine に関する記事で詳しく説明されています。
[Script Machine] (スクリプト マシン) コンポーネントで、[New] (新規) ボタンをクリックします。
[Save Graph] (グラフの保存) ウィンドウで、新しいフォルダーを作成し、その名前を "Scripts" に変更します。
Scripts フォルダーを開き、[File name] テキスト ボックスに「PlayVideoButton」と入力します。
完了したら、[Save] (保存) ボタンを選択します。
[Script Machine] (スクリプト マシン) コンポーネントで、グラフの Title (タイトル) フィールドに名前「Video Player」を入力します。
グラフの Summary (概要) フィールドに、「Defines how the video player responds to play/stop actions」と説明を入力します。
スクリプト グラフの設定
[Script Machine] (スクリプト マシン) コンポーネントで、[Edit Graph] (グラフの編集) をクリックします。 すると、[Script Graph] (スクリプト グラフ) ウィンドウが開きます。 このウィンドウがタブ領域にまだ配置されていない場合は、[Project] タブおよび [Console] タブの横にドラッグして配置し、スクリプト グラフと [Scene] ウィンドウを同時に表示できるようにします。
ノードを追加するときに、ウィンドウの領域を増やせます。3 点リーダー ボタンをクリックし、[Maximize] (最大化) を選択して行うか、ウィンドウの右上隅にある [Full Screen] (全画面) ボタンをクリックします。
Note
ノードは、Visual Scripting では ユニットともいいます。 このチュートリアルでは、引き続きノードという用語を使用します。
既定の OnStart ノードと OnUpdate ノードは必要ありません。削除してください。
スクリプト グラフのレイアウト
スクリプト グラフには、次の 2 つのセクションがあります。
セクション 1: ビデオ プレーヤーの [Play/Stop] (再生/停止) ボタンがクリックされたタイミングを検出します。 セクション 2: クリックされたら、ビデオを再生します。 もう一度クリックされたら、ビデオを停止します。
最終的な結果のプレビューを次に示します。
ボタンがクリックされたかどうかを検出する
ボタンがクリックされたかどうかを検出する最初のセクションには、3 つのノードが必要です。 クリックを実際に "リッスン" して反応するプロジェクトの GameObject は、Button です。 これをスクリプト グラフに追加してみましょう。
Button オブジェクト変数を作成する
[Hierarchy] 階層 で、PlayVideoButton を展開します。
[Script Graph] (スクリプト グラフ) の [Blackboard] (黒板) で、新しいオブジェクト変数を作成します。New Variable Name (新しい変数名) フィールドに名前「Button」を入力し、[+] ボタンをクリックします。
オブジェクト変数の型を [Game Object] (ゲーム オブジェクト) に設定します。
[Hierarchy] (階層) から Button GameObject をドラッグし、新しい変数の Value (値) フィールドにドロップします。
Button オブジェクト変数を [Blackboard] (黒板) からドラッグし、スクリプト グラフにドロップしてノードとして追加します。
ヒント: ここで少し時間を取って、Button GameObject のコンポーネントの一部を調べることができます。
[Mesh Interactable Setup]: このコンポーネントにより、Button がインタラクション可能なオブジェクトになります。 詳細については、「Interactable を使用してつかむ、持つ、投げる」をご覧ください。
[Script Machine] (スクリプト マシン): [Button Base Behaviour] (ボタン基本動作) というスクリプト グラフがあります。
再生モードになると、Button に [Mesh Interactable Body] という新しいコンポーネントが追加されていることがわかります。
このコンポーネントは、実行時にインタラクション可能な本体に自動的に追加されます。すぐに役立つ IsHovered や IsSelected など、さまざまなプロパティがビジュアル スクリプトに公開されます。
スクリプト グラフで、ボタンが選択されたら通知するノードを追加しましょう。
必要な場合は再生モードを終了し、[Hierarchy] (階層) で PlayVideoButton を選択して、[Script Graph] (スクリプト グラフ) ウィンドウにそのグラフが表示されていることを確認します。
スクリプト グラフで、Get Object Variable ノードの出力ポートをクリックして長押しし、マウス ボタンを離します。 これにより、Fuzzy Finder が開きます。 警告: Fuzzy Finder を開いたら、Unity インターフェイスの外側をクリックしないでください。 これにより、Fuzzy Finder が閉じられ、スクリプト グラフで予期しない動作が発生します。
[Is Selected] (選択されたとき) を検索し、一覧で [Mesh Interactable Body: IsSelected] を選択します。
注: このノードはブール値を出力します。これはグラフのインスペクターで確認できます。
Is Selected ノードの出力ポートからコネクタをドラッグし、Microsoft Mesh: On State Changed という名前の新しいノードを作成します (Fuzzy Finder で、「on state changed」を検索します)。
これらは、3 つのボタン クリック検出ノードです。 Is Selected ノードの値は False で始まりますが、ボタンがクリックされると値が True に変わり、On State Changed ノードに渡されます。 このノードは、次に追加される再生/停止ノードをトリガーします。
ビデオを再生または停止する
[On State Changed] の値が true の場合、ビデオが再生されます。 既に再生中でボタンが押されている場合、[On State Changed] は false 値に変更され、ビデオの再生が停止します。 これは、表示可能なビデオと静止画像を表示するために少し後で追加される、スクリプト グラフのセクション 2 のノードに影響します。
次の手順では、フローを決定する if ノードを追加します。
On State Changed ノードの制御出力ポートからコネクタをドラッグし、新しく if ノードを作成します (Fuzzy Finder で、「if」を検索します)。
On State Changed ノードのデータ出力ポートから、if ノードのデータ入力ポートにコネクタをドラッグします。
ビデオが再生されているかどうかを判断する変数を作成する
[Blackboard] の [Object] タブに移動し、「isPlaying」という変数を作成します。[Type] を [Boolean] にし、[Value] チェックボックスはオフのままにします。 この結果、ブール値の既定値は false になります。
"isPlaying" 変数をスクリプト グラフにドラッグし、*If ノードの右側にドロップします。
If ノードの True 制御出力ポートからコネクタをドラッグし、新しく "オブジェクト変数の設定" ノードを作成します (Fuzzy Finder で、「set object」(オブジェクトの設定) を検索します)。
"オブジェクト変数の設定" ノードで、変数名のドロップダウンをクリックし、[isPlaying] を選択します。
isPlaying 変数はここでは 2 つの役割を果たす必要があります。 isPlaying の値が常に正しいことを確認するために、Negate ノードからの入力を与えてみましょう。
"オブジェクト変数の設定: isPlaying" ノードの下部にあるデータ入力ポートからコネクタをドラッグし、新しく Negate ノードを作成します (Fuzzy Finder で、「negate」を検索します)。
Negate ノードのデータ入力ポートからコネクタをドラッグし、新しく "オブジェクト変数の取得" ノードを作成します (Fuzzy Finder で、「get object variable」(オブジェクト変数の取得) を検索します)。
"オブジェクト変数の取得" ノードで、変数名のドロップダウンをクリックし、[isPlaying] を選択します。
Negate ノードは、IsPlaying の値を現在設定されているものと逆の値に変更します。 シーンの開始時、isPlaying は false (既定値) です。 [Play/Stop] (再生/停止) ボタンがクリックされると、Negate ノードによって "オブジェクト変数の設定" ノードの isPlaying が true に設定され、ビデオが再生されます。 ボタンがもう一度クリックされると、Negate ノードによって isPlaying がまた false に設定され、ビデオが停止します。
ビデオを再生するまたは静止画像を表示する
今度は、スクリプト グラフのセクション 2 の作成を開始します。 isPlaying が変更されたかどうかを検出するノードを追加します。これにより、ビデオを再生するか、ステーション 3.1 の WebSlate で静止画像を表示するかを決定します。
グラフの下側部分で、"オブジェクト変数の取得" ノードを追加し、その値を isPlaying に設定します。 (グラフ内で右クリックし、[Add Node] (ノードの追加) を選択できます。「get object」(オブジェクトの取得) を検索してください。)
オブジェクト変数の取得: isPlaying ノードのデータ出力ポートからコネクタをドラッグし、新しく On State Changed ノードを作成します。 (Fuzzy Finder で、「on state changed」を検索します)。
On State Changed ノードの制御出力ポートからコネクタをドラッグし、新しい if ノードを作成します。 (Fuzzy Finder で、「if」を検索します)。
On State Changed ノードのデータ出力ポートからコネクタをドラッグし、if ノードのデータ入力ポートに接続します。
Video および VideoStill (画像) GameObjects
[Hierarchy] (階層) で、VideoPlayer GameObject を展開して、Video と VideoStill という 2 つの子オブジェクトがあることに注意してください。
Video を選択し、[Inspector] (インスペクター) で次の点に注意してください。
Video には Video Player という名前のコンポーネントがあり、そこには風力タービン ビデオへのリンクがあります。
ビデオ は非アクティブです (名前の横にあるチェック ボックスがオフになっています)。
[Hierarchy] (階層) で、VideoStill GameObject を選択し、[Inspector] (インスペクター) で次の点に注意してください。
VideoStill には静止画像がアタッチされています。
VideoStill はアクティブです (名前の横にあるチェック ボックスがオンになっています)。
シーンが開始されると、ビデオ画面に静止画像が表示され (VideoStill がアクティブであるため)、ビデオは再生されません (Video が非アクティブであるため)。 出席者が [Play] (再生) の表示中に [Play/Stop] (再生/停止) ボタンを押すと、Video がアクティブになってビデオが再生され、同時に VideoStill が非アクティブになって静止画像が非表示になります。 ボタンのラベルも [Play] (再生) から [Stop] (停止) に変わります。出席者がボタンをもう一度押すと、Video が非アクティブになってビデオが停止し、VideoStill が再度アクティブになってビデオ画面に再び静止画像が表示されます。
グラフの残りのノードによって、このすべてが発生します。
Video および VideoStill (画像) のオブジェクト変数を作成する
Video および VideoStill GameObjects の値を保持するオブジェクト変数を作成しましょう。
[Hierarchy] (階層) で、VideoPlayer を展開します。
[Script Graph] の [Blackboard] で、新しいオブジェクト変数を作成します。"New Variable Name" フィールドに名前「Video」を入力し、[+] ボタンをクリックします。
オブジェクト変数の型を [Game Object] (ゲーム オブジェクト) に設定します。
[Hierarchy] (階層) から Video GameObject をドラッグし、新しい変数の Value (値) フィールドにドロップします。
[Blackboard] (黒板) で、新しいオブジェクト変数を作成します。New Variable Name (新しい変数名) フィールドに名前「VideoStill」を入力し、[+] ボタンをクリックします。
オブジェクト変数の型を [Game Object] (ゲーム オブジェクト) に設定します。
[Hierarchy] (階層) から VideoStill GameObject をドラッグし、新しい変数の Value (値) フィールドにドロップします。
スクリプト グラフの構造
ここで一旦停止して、スクリプト グラフのセクション 2 の残りの部分を設計する方法を検討します。 "If" ノードは、"true" フローと "false" フローに分岐します。 オブジェクト変数は両方のフローに簡単にアクセスできる必要があるため、次に示すように、フロー間の行に配置します。
Video オブジェクト変数と VideoStill オブジェクト変数をスクリプト グラフに追加する
Video オブジェクト変数を [Blackboard] からドラッグし、スクリプト グラフにドロップしてノードとして追加します。 これを If ノードの下に配置します。
VideoStill オブジェクト変数を Blackboard からドラッグし、スクリプト グラフにドロップしてノードとして追加します。 Get Object Variable: Video ノードの右側に配置します。
ビデオをオンにする
If ノードの "True" 制御出力ポートからコネクタをドラッグし、新しい Game Object: Set Active ノードを作成します。 (Fuzzy Finder で、「set active」を検索します。)
Get Object Variable: Video ノードのデータ出力ポートからコネクタをドラッグし、Game Object: Set Active ノードの最初のデータ入力ポートに接続します。
ノードの [Value] チェック ボックスをオンにすると、ノードがアクティブになります。
Get Object Variable: VideoStill ノードのデータ出力ポートからコネクタをドラッグし、先ほど作成した Game Object: Set Active ノードの最初のデータ入力ポートに接続します。
ノードの [Value] チェック ボックスをオフのままにします。 これにより、ノードが非アクティブになります。
ボタンがクリックされると、ビデオが再生され、静止画像が非表示になります。 このシーケンスで、もう 1 つだけ必要な操作があります。 [Play/Stop] ボタンはトグルであるため、出席者が [Play] をクリックするとボタンのラベルが [Stop] に変わり、再びクリックするとラベルが [Play] に戻るようにする必要があります。 これを実現するには、オブジェクト変数を作成して追加し、TextMeshPro ノードを追加する必要があります。
Label オブジェクト変数を作成して追加する
[Hierarchy] で、PlayVideoButton とその子オブジェクト Button が展開されていることを確認します。
スクリプト グラフ Blackboard で、新しいオブジェクト変数を作成します。(新しい変数の名前) フィールドに「Label」という名前を入力し、[+] ボタンをクリックします。
オブジェクト変数の型を [Game Object] (ゲーム オブジェクト) に設定します。
[Hierarchy] から Label GameObject をドラッグし、新しい変数の [Value] フィールドにドロップします。
Label オブジェクト変数を Blackboard からドラッグし、スクリプト グラフにドロップしてノードとして追加します。 Get Object Variable: VideoStill ノードの右側に配置します。
Text Mesh Pro ノードを追加する
Game Object: Set Active ノードの制御出力ポートからコネクタをドラッグし、新しい Text Mesh Pro: Set Text ノードを作成します。 (Fuzzy Finder で、「set text」を検索します。) Game Object: Set Active ノードの右側の上の行に配置します。
Get Object Variable: Label ノードのデータ出力ポートからコネクタをドラッグし、Text Mesh Pro: Set Text ノードの一番上のデータ入力ポートに接続します。
ノードのテキスト フィールドに、「Stop」と入力します。
ビデオを停止するノードを追加する
このグラフには、さらに 3 つのノードがあります。 ビデオの再生中にボタンがクリックされたら、isPlaying 変数が false になってビデオが停止し、ボタン ラベルが再び [Play] に変わるように、ボタンの false 条件を設定する必要があります。
ここではショートカットを使用できます。
"if true" フローを構成する一番上の行の 3 つのノードを Control キーを押しながらクリックします。
スクリプト グラフを右クリックし、ポップアップ メニューで [Duplicate Selection] を選択します。
複製したノードをグラフ内で下にドラッグし、変数の行の下に配置します。
"if false" ノードを設定する
Get Object Variable: Video ノードのデータ出力ポートからコネクタをドラッグし、ノードの一番下の行の最初の Game Object: Set Active ノードの一番上のデータ入力ポートに接続します。
同じ最初の Game Object: Set Active ノードで、[Value] を選択解除します。
Get Object Variable: VideoStill ノードのデータ出力ポートからコネクタをドラッグし、ノードの一番下の行の 2 つ目の Game Object: Set Active ノードの一番上のデータ入力ポートに接続します。
2 つ目の Game Object: Set Active ノードで、[Value] を選択します。
Get Object Variable: Label ノードのデータ出力ポートからコネクタをドラッグし、その右側にある Text Mesh Pro: Set Text ノードの一番上のデータ入力ポートに接続します。
同じ "Text Mesh Pro: Set Text" ノードで、テキストを "Stop" から "Play" に変更します。
If ノードの "False" 制御出力ポートからコネクタをドラッグし、ノードの最も下の行にある最初の "Game Object: アクティブに設定" ノードの制御入力ポートに接続します。
ビデオ プレーヤーのインタラクションをエクスペリエンス内の他のユーザーと共有する
イベントをトリガーする出席者のみにスクリプトのイベントを体験させたい場合や、シーン内のすべてのユーザーにイベントを体験させたい場合があるでしょう。 これは、[Local Script Scope] (ローカル スクリプト スコープ) コンポーネントで制御できます。
[Hierarchy] (階層) で、PlayVideoButton が選択されていることを確認します。
[Inspector] (インスペクター) で、[Add Component] (コンポーネントの追加) ボタンをクリックし、[Local Script Scope] (ローカル スクリプト スコープ) を追加します。
このチュートリアルでは、エクスペリエンスのすべての出席者がビデオ プレーヤーとのインタラクションを確認でき、ビデオ自体の再生および一時停止を確認できるようにする必要があります。 これを実現するには、[Share visual script variables on this Game Object] (このゲーム オブジェクトでビジュアル スクリプト変数を共有する) オプションが選択された状態にします。 このオプションの下の情報ボックスには、共有対象とローカルのままのものが表示されます。
作業をテストする
Unity でプロジェクトを保存し、[Unity Editor Play] ボタンを押します。
[Game] (ゲーム) ウィンドウで、ビデオ プレーヤーの下にある [Play] (再生) ボタンをクリックします。 すると、ボタンのラベルが [Stop] (停止) に変わり、ボタンの上の画面で風力タービンに関する短いビデオが再生されます。
ビデオの視聴が完了したら、編集中のボタンをもう一度押します (ラベルが [Stop] (停止) になります)。
Unity エディターの [Play] (再生) ボタンを押して、再生モードを終了します。
ステーション 3.2: 情報ダイアログをトリガーする
この機能では、アバターがボタンを押したときに情報ダイアログが表示される既存のビジュアル スクリプトを強化します。
[Hierarchy] (階層) で、3.1 -- Video GameObject を折りたたみます。
[Scene] (シーン) ウィンドウで、情報ダイアログ トリガー ステーションが 3.1 -- Video Playback ステーションの右側にあることに注意してください。 ステーション 3.2 がはっきり見えるようにビューを調整します。
[Inspector] (インスペクター) で、3.2 -- Info Dialog という名前の GameObject を展開します。
[Hierarchy] (階層) で、InfoButtonWrapper を選択します。
[Inspector] (インスペクター) で、InfoButtonWrapper に [Local Script Scope] (ローカル スクリプト スコープ) コンポーネントがアタッチされており、その[Share visual script variables on this Game Object] (このゲーム オブジェクトのビジュアル スクリプト変数を共有する) オプションが選択されていないことに注意してください。
これは、出席者が情報ダイアログを表示するボタンをクリックすると、そのボタンが出席者に対し非表示になるためです。 このオプションが選択されている場合、ボタンはシーン内のすべてのユーザーに対して非表示になりますが、それは望んでいません。
[Inspector] (インスペクター) で、[Show Dialog] (ダイアログの表示) グラフがある [Script Machine] (スクリプト マシン) コンポーネントに移動し、[Edit Graph] (グラフの編集) ボタンをクリックします。
グラフで、If ノードの True 制御出力ポートからコネクタをドラッグし、新しい Microsoft Mesh: Show Dialog ノードを作成します。 (Fuzzy Finder で、「show dialog」を検索します)。
Show Dialog ノードで、Message (メッセージ) フィールドをクリックし、"Message" という単語を次の文に置き換えます。
Did you know that the world's largest wind turbine has blades longer than a football field?
これは情報ダイアログに表示されるメッセージです。
現在 [OK] が表示されているドロップダウンを選択し、ポップアップ リストで [OK] の選択を解除し、[Continue] (続行) を選択します。 すると、情報ダイアログに、メッセージを読み終わったらクリックしてダイアログを閉じることができる [Continue] (続行) ボタンが追加されます。
作業をテストする
Unity エディターで、プロジェクトを保存し、Unity エディターの [Play] (再生) ボタンを押します。
ナビゲーション キーを使用して、アバターをボタンから離れさせます。 アバターが一定距離離れている場合、ボタンは回転し、選択できないことに注意してください。
ボタンに向かって歩きます。 特定の時点でボタンの回転が停止し、選択できることを通知します。
ボタンを選択します。 情報ダイアログが表示され、前に Show Dialog ノードに追加したメッセージが表示されます。
Note
再生モードでの情報ダイアログの外観は、Mesh での表示方法とは異なり、Sphere Terrace の他のパネルと同じように表示されます。
情報ダイアログが完了したら、その [Continue] ボタンをクリックします。 ボタンをクリックすると消える点に注意してください。 ボタンをもう一度使用するには、再生モードを終了してから再度開始する必要があります。
ヒント
ここで有効な距離とトリガー要素は、ProximityDetector GameObject のコンポーネントによって決まります。
Unity エディターの [Play] (再生) ボタンを押して、再生モードを終了します。
ステーション 3.3: タービン発電機へのテレポート
この機能を使用すると、シーン内の出席者がテレポートできるように、スクリプト グラフにノードをいくつか追加できます。 出席者はボタンを押すと、ステーション 3.3 の現在の場所から、風力タービン発電機に接続されている高架プラットフォームにテレポートします。 その後、出席者は発電機を調べることができます。
スクリプト グラフを更新する
[Scene] ウィンドウで、3.3 - Teleport to Turbine ステーションが 3.2 -- Info Dialog Trigger ステーションの右側にあることを確認します。 ステーション 3.3 が明確に表示されるようにビューを調整します。
[Hierarchy] で、3.2 - Info Dialog GameObject を折りたたみ、3.3 - Teleport GameObject を展開します。
ボタンはすべて設定されています。テレポート動作を提供するノードをスクリプト グラフに追加するだけです。
[Hierarchy] で、ChapterLabel GameObject を展開し、TeleportToWindTurbineButton GameObject を選択します。
[Inspector] には、Teleport to Location という名前の Script Machine コンポーネントがあり、「TeleportToLocationButtonStart」という名前のスクリプトがアタッチされていることに注意してください。 [Source] オプションは [Graph] に設定されます。これは、スクリプト グラフが独立したファイルとしてプロジェクトに格納されていることを意味します。
[グラフの編集] ボタンをクリックします。 前のチャプターと同様に、グラフには既にいくつかのノードが設定されています。
このスクリプト グラフにノードを追加します。
移動ポイントを作成して参照を追加する
「移動ポイント」とは何でしょうか。 移動ポイントとは、空間内の特定のポイントを定義して、そのポイントを生成先またはテレポート先として使用するためのコンポーネントです。 通常は、最初に移動グループを作成し、そこに 1 つ以上の移動ポイントを追加します。 このプロジェクトでは、移動グループが既に作成されているため、以下の手順に従って、そのグループに移動ポイントを追加します。 次に、アバターが [Teleport] ボタンをクリックしたときに移動する場所として、その移動ポイントを使用します。 詳細については、「アバターの生成ポイントとテレポート ポイントを作成する」の記事をご覧ください。
[Hierarchy] で、TravelGroup の子オブジェクトとして新しい空の GameObject を作成し、「TeleportLocationWindTurbine」という名前に変更します。
[Inspector] で、[Add Component] ボタンをクリックし、移動ポイント コンポーネントを検索して追加します。
[Inspector] の Transform コンポーネントに、次の値を入力します。
[Position]\(位置\):
X = 6
Y = 56
Z = 60回転:
X = 0
Y = 255
z = 0アバターはこの場所にテレポートされます。
[Inspector] で、名前の横にあるチェック ボックスをオフにして、TeleportLocationWindTurbine GameObject を非アクティブにします。 実行時に複数の TravelPoint オブジェクトがアクティブになっている場合、Unity はアクティブな移動ポイントの 1 つをアバターの生成ポイントとしてランダムに選択します。 アバターが TeleportLocationChapter3 GameObject によって示されるポイントで生成されるようにし、それが唯一のアクティブな移動ポイントになるようにします。 非アクティブになった結果、TeleportLocationWindTurbine は [Hierarchy] で淡色表示されます。
テレポート位置オブジェクト変数を作成して追加する
スクリプト グラフ Blackboard で、新しいオブジェクト変数を作成します。(新しい変数の名前) フィールドに「TeleportLocation」という名前を入力し、[+] ボタンをクリックします。
オブジェクト変数の型を [Game Object] (ゲーム オブジェクト) に設定します。
[Hierarchy] から、TeleportLocationWindTurbine GameObject をドラッグし、新しい変数の [Value] フィールドにドロップします。
Button オブジェクト変数を [Blackboard] (黒板) からドラッグし、スクリプト グラフにドロップしてノードとして追加します。 If ノードの下に配置します。
テレポート ノードを追加する
If ノードの "True" 出力制御ポートからコネクタをドラッグし、Game Object: Set Active という名前の新しいノードを作成します。 (Fuzzy Finder で、「set active」を検索します。)
Get Object Variable: TeleportLocation ノードのデータ出力ポートからコネクタをドラッグし、Game Object: Set Active ノードの最初のデータ入力ポートに接続します。
ノードの [Value] オプションを選択してアクティブにします。
Travel Point ノードを追加する
Game Object: Set Active ノードの制御出力ポートからコネクタをドラッグし、Travel Point: Travel to Point という名前の新しいノードを作成します。 (Fuzzy Finder で、「travel point: travel」を検索します。)
Get Object Variable: TeleportLocation ノードのデータ出力ポートからコネクタをドラッグし、Travel Point: Travel to Point ノードのデータ入力ポートに接続します。
これで、グラフが完了しました。
作業をテストする
Unity エディターで、プロジェクトを保存し、Unity エディターの [Play] (再生) ボタンを押します。
ステーション 3.3 に移動し、[Teleport] ボタンをクリックして風力タービン発電機にテレポートします。
3.3 - Generator 情報ボックスで、[Show/Hide Generator] ボタンを選択します。 風力タービンの側面に窓が開き、内部に発電機が見えます。
自由に発電機に近づいて、見てください。 実に素晴らしいです。 完了したら、元に戻り、[Show/Hide Generator] ボタンを押します。 これで、ウィンドウが閉じます。
チャプター 4 に移動する
ここで、エクスペリエンスの出席者はチャプター 4 に進み、物理に関連する風力タービンの動きについて学ぶ準備が整いました。 チャプター 3 と同様に、チャプター 4 のステーションを含む Sphere Terrace があります。 そのためには、次のようにします。
風力タービン発電機と逆方向に回転し、3.3 -- Go to Chapter 4 情報ボックスに向かって歩きます。
[Teleport to Chapter 4] ボタンを押します。
宣伝されているように、チャプター 4 と Mesh Physics のステーションの前にアバターが配置されます。
第 3 章: まとめ
この章では、Mesh Visual Scripting を使用して、エクスペリエンスの出席者が次のことを実行できるようになる機能を追加しました。
風力タービンに関する教育ビデオが再生されるボタンを押します。
風力タービンに関する情報ダイアログの表示をトリガーするボタンを押します。
参加者を地面から風力タービン発電機に取り付けられた足場にテレポートするボタンを押します。そこでは、発電機を間近で調べることができます。