Mesh Visual Scripting のプログラマ ガイド
Visual Scripting の概要記事に移動します
制限事項
- Unity 機能のサブセットのみがビジュアル スクリプトに公開されます。
- 単純ではない型 (オブジェクト参照を含む) を持つ変数とプロパティは、自動的には共有されません。 詳細については、以下の「共有とネットワーク」をご覧ください。
Hello World
作成できる最も簡単なビジュアル スクリプトは、メッセージ ボックスを開くだけのスクリプトです。
Mesh での外観は次のとおりです。
スクリプトのテスト
Mesh にシーンをアップロードする前に、Play Mode with Mesh Emulation を使用して、分割画面モードの複数のクライアントでも、ビジュアル スクリプトの開発やテストを行うことができます。
エディターでのビジュアル スクリプト診断
Script Machine を伴う GameObject が変換階層で選択されている場合、Mesh はインスペクター パネルの下部に Mesh Visual Scripting Diagnostics パネルを表示します。
診断パネルには、Mesh でスクリプトが正常に動作しない可能性がある警告やエラーに関するフィードバックがすぐに表示されます。
現在の制限: 将来のバージョンの診断パネルでは、ビジュアル スクリプトによる共有変数とプロパティの使用に関する分析情報が得られ、追加の診断と警告が表示される場合もあります。
Mesh へのアップロード
Mesh Uploader を使用して、ビジュアル スクリプトを含むシーンをアップロードします。 Uploader を開くには、[Mesh Toolkit] メニューの [Environments] を選択します。
注: Mesh Uploader は、アップロード前にビジュアル スクリプトを検証し、ビジュアル スクリプトに検証エラーがある場合はアップロードを拒否します。 詳細な診断は、Console に出力されます。
共有とネットワーク
共有スクリプトとローカル スクリプトの状態
Mesh では、ネットワークなしで動作するように設計された Unity Visual Scripting が使用されます。 ビジュアル スクリプトは、各クライアントで個別に実行されます。 ただし、ユーザーの Mesh エクスペリエンスは共有されます。すべてのユーザーは、すべてのクライアントで同じように見える 1 つの共有シーンを体験します。
ビジュアル スクリプトの実行の効果は、シーンの状態をどのように変更するかによります。
既定では、Mesh は、1 つのクライアント上のビジュアル スクリプトによって行われたシーン変更を、他のすべてのクライアントに自動的にレプリケートします。 シーンで共有されるすべてのものとは別に、一部の状態は、各クライアント (つまり、ローカル) で独立しています。
ローカルの変更は、クライアントからの変更よりも一時的に優先されます。 例: オブジェクトをローカルでアニメーション化を続ける場合、他のクライアントからの変更によってローカルのアニメーションが損なわれることはありません。
自動更新レートの制限がいくつかあります。 クライアントは、まだ処理中に追加の更新プログラムを送信しません。サーバーを介してラウンドトリップごとに 1 つの更新が送信されます。 これは、実際の状況では、1 秒あたり約 5 ~ 6 回の更新に相当します。 つまり、あるクライアントで動作する滑らかなアニメーションは、他のクライアントでは滑らかに見えません。 ベスト プラクティスは、滑らかなアニメーションをローカルで実行することです。理想的には、ビジュアル スクリプトではなく、通常の Unity アニメーション システムを使用します。
共有状態が最終的に一貫して保証されます (クライアントの状態が一時的に異なる場合でも)。
ローカル状態:
- 自然なローカル状態 - サウンド、UI、レンダリング。
- ユーザーが制御するローカル状態 - Local Script Scope コンポーネントでマークされたサブシーン。
- 技術的なローカル状態 - シーン階層の一部ではないオブジェクト (レンダラーマテリアル、アセットなど)。
共有状態:
- ビジュアル スクリプト変数と、シーン階層の一部である GameObjects とシーン コンポーネントのプロパティに限定されます。
- 単純型の変数とプロパティ (整数、浮動小数点数、ブール値、文字列、
Color
、Vector2
/3
/4
、Quaternion
、Matrix4x4
、Rect
) のみをレプリケートできます。
共有状態への変更は、ネットワーク経由で送信されます。 これにより、ネットワーク トラフィックが増加し、十分に検討せずに使用された場合は、かなりの帯域幅を消費する可能性があります。
共有スクリプト トリガーとローカル スクリプト トリガー
すべてのビジュアル スクリプト フローは、イベントに応答して開始されます。
- イベントが 1 つのクライアントで発生した場合 (ユーザーがボタンをクリックした場合など)、ビジュアル スクリプトはそのクライアントでのみ実行されます。
- イベントがすべてのクライアントで発生した場合、ビジュアル スクリプトはすべてのクライアントで実行されます (タイマー イベント、共有プロパティの変更、共有変数の更新、アバターがトリガーに入り、物理ボディがコライダーに触れるなど)。
オブジェクトが選択されているかどうかを検出するノードを追加する場合は、正しいものを選択することが重要です。 Mesh Interactable Body: Is Selected Locally と Mesh Interactable Body: Is Selected の、2 つの選択肢があります。 たとえば、クリックしてテレポーテーションをトリガーできるボタンがあるとします。 出席者がボタンをクリックして自分自身のみを転送するには、Mesh Interactable Body: Is Selected Locally ノードを使用します。
出席者にボタンをクリックしてもらい、環境内のすべてのユーザーをテレポートするには、Mesh Interactable Body: Is Selected ノードを使用します。 いずれの場合も、ノードの上にあるテキストによって、想定される動作が示されます。
ローカル スクリプトが共有変数を設定し、2 つ目のスクリプトがこの変数の変更をリッスンする場合 (On State Changed トリガーを使用します。以下をご覧ください)、2 つ目のスクリプトはすべてのクライアントで実行されます。
Mesh には、いくつかの特殊なスクリプト ノードが用意されています。
- On Interval では、すべてのクライアントで一定の間隔で同期的にトリガーされます。
- On State Changed では、入力が変更されたときにトリガーされます (共有プロパティ、共有変数、ローカルなど)。
- Show Dialog では、オプションで応答オプションとしてボタンを提供できるカスタム テキストを含むメッセージ ダイアログを表示します。
Mesh は、シンプルさを優先して特定のトレードオフを行います。
- 複数のクライアントが同じデータを変更しようとすると、最後のクライアントが優先されます (トランザクション ベースのデータ更新モデルを使用する代わりに)。
- データの一貫性を確保するために、すべてのクライアントで実行されるビジュアル スクリプトは、共有プロパティまたは変数の読み取りと書き込みを行うことはできません。 この場合、ランタイム エラーがトリガーされ、スクリプト フローの実行が中止されます。
ベスト プラクティス
ビジュアル スクリプトは、ネイティブ C# コードよりも大幅に遅くなります。 さらに、Mesh は、ネットワークやその他の統合機能を使用してビジュアル スクリプトを拡張し、一見オーバーヘッドの少ないビジュアル スクリプト アクションによってネットワーク トラフィックが発生する可能性があります。 ビジュアル スクリプトから最適なパフォーマンスを得る方法については、次の記事を参照することをお勧めします。
Visual Scripting のベスト プラクティスの概要
パフォーマンスに関する Visual Scripting のベスト プラクティス
ネットワークに関する Visual Scripting のベスト プラクティス
デバッグに関する Visual Scripting のベスト プラクティス
セキュリティ
Mesh は、次のような脅威シナリオからユーザーを保護します。
- 侵害されたシーン コンテンツ。たとえば、機密性の高いローカル データへの悪意のあるアクセス試行などです。
- 侵害されたクライアントまたはトランスポート チャネル。たとえば、アクセスできないリモート データを他のクライアントで読み書きしようとする悪意のある試行などです。
これを実現するために、Mesh はサンドボックス (Web ブラウザーの JavaScript など) でビジュアル スクリプトを実行します。
シーンの起動時に、Mesh はキュレーションされた許可リストを使用してビジュアル スクリプトを検証し、特定の種類の Unity コンポーネントとそのプロパティの安全なサブセットへのアクセスを制限します。
シーン実行時に、Mesh はシーンの特定の部分へのアクセスを制限します。
- ローカル: Mesh 内部やその他の機密データへのアクセスを禁止します。
- リモート: シーンの作成者がシーンのこの部分を変更することを確認します。 これを行うには、受信側側のビジュアル スクリプトを静的に分析して、潜在的なシーン書き込みを行います。
例 :
- 悪意のあるローカル ビジュアル スクリプトでは、すべてのアバターをボブルヘッドにしようとしています。 そのために、アバターの頭部を表す GameObject のシーン全体をスキャンしようとします。 Mesh はスキャン結果を自動的にフィルター処理してアバター システムを除外します。
- 悪意のあるリモート クライアントは、すべての GameObject を逆さまで反転することで、シーンを逆向きにしたいと考えています。 これを実行するために、シーン内の各 GameObject の垂直方向のスケールを設定するプロパティの更新を送信します。 ただし、受信側のクライアント上のビジュアル スクリプトでは、そのような処理を行うように設計されていないため、ローカル クライアントはリモートの入力を無視します。
Mesh 統合
現在の制限事項: このセクションでは、進行中の機能のプレビューについて説明します。
一般に、他のコンポーネントとの統合は、多くの場合、コンポーネントプロパティの変更を変更してリッスンすることによって行われます。 次に例を示します。
Interactables: "Is Hovered" プロパティと "Is Selected" プロパティを確認します。
物理相互作用: トリガーボリュームまたはコライダーと接触している身体を観察します。
アバター: アバターの位置の読み取り、回転の表示、ネーム プレート。 (まだ使用できません。)
セッション状態: 参加者を一覧表示し、参加者情報を読み取ります。 (まだ使用できません。)
Cloud Scripting: 変数とコンポーネントのプロパティを読み書きできるクラウド スクリプトと連携して動作します。 (まだ使用できません。)
一部のコンポーネントでは、ローカル アクションが提供されます。
- Audio Manager
- タイムライン
- アニメーター
- レンダリング: マテリアル プロパティとシェーダー プロパティの読み取りと書き込み
物理演算は、特定の物理オブジェクトのシミュレーションが常に 1 つのクライアント (その所有者) によってのみ権限を持って実行されるため、特別に処理されます。 この作業を行うために、物理プロパティを設定すると、変更を適用するクライアントへの所有権の自動転送がトリガーされます。