Unreal Engine の従来のアクタ システムとは異なり、Scene Graph ではエンティティとコンポーネントのシステムを使用してワールド内のオブジェクトを定義します。 エンティティはコンポーネントや他のエンティティのコンテナとして機能し、コンポーネントはアタッチされた先のエンティティとの関係を提供します。 Scene Graph でゲーム オブジェクトを作成するには、ベースとなるエンティティから開始し、コンポーネントを使用してデータと動作を追加します。 コンポーネントそれぞれがエンティティに新しい動作をもたらします。コンポーネントを組み合わせることで、再利用やイテレートができる複雑なオブジェクトを構築できます。
制作の基本
それを説明するために、テンプレート ホールの最初のセクションにある一連のライトポストを見ていきましょう。 各ライトポストはプレハブ、つまり 1 つのオブジェクトとして保存されたエンティティとコンポーネントの集合体です。 プレハブ オブジェクトでは、作成元のエンティティとコンポーネントの特性、動作、プロパティ、および属性が共有されています。 エンティティとコンポーネントの詳細については、ドキュメント「エンティティとコンポーネントを操作する」を参照してください。
インスタンス化によるイテレーション
プレハブはアセットであるため、編集中やゲームプレイ中にレベル内でインスタンス化できます。 プレハブをコンテンツ ブラウザからドラッグするか、Verse コードを使ってコピーを作成するごとに、その Scene Graph プレハブの新規インスタンスがワールド内にインスタンス化されます。
プレハブの各インスタンスで独自にメモリが使用され、処理のオーバーヘッドが発生しますが、新しいプレハブをインスタンス化してもメモリが 2 倍になるわけではありません。プレハブで使用されるアセット リソースはインスタンス間で共有されているからです。
プレハブは同じオブジェクトを複数個インスタンス化できる強力な仕組みであると同時に、デザインをすばやくイテレートする便利な手法でもあります。 コンテンツ ブラウザで「LightPost」フォルダを開きます。 このフォルダには、最終的な P_LightPost プレハブ デザインの作成に使用したアセットが格納されています。
ホールの各ライトポストは、このプレハブの一部です。 ホールを下へ移動していくと、最終的なプレハブ デザインに到達するまで、一歩ごとに新しいコンポーネントが追加されていきます。
最初のライトポストは、ライトポスト、ピボット、ランタンの 3 つのエンティティでできた単純な構成となっています。 これら 3 つのエンティティそれぞれに、レベル内におけるエンティティの場所を決定する transform_component があります。 親とランタン エンティティの両方に、それぞれを可視状態にして、ライトポストとランタンのモデルを表示する mesh_component があります。 これらは、ライトポストとランタンの連結部に相当するピボット エンティティによって接続されています。
2 つ目のライトポストは元のデザインをイテレートしたもので、ランタンの子孫として sphere_light_component を持つ新しいエンティティが追加されており、発光するようになっています。
単に光るだけではそれほど面白くないため、3 つ目のライトポストには particle_system_component を追加し、SphereLight エンティティの周囲を飛ぶ虫をシミュレートして視覚的な効果を高めています。
さらに移動して、4 つ目のライトポスト インスタンスでは、ピボット エンティティにカスタムの simple_movement_component と keyframe_movement_component の 2 つが追加されています。 これらのコンポーネントが連携してエンティティとその子孫の動きをシミュレートし、ランタンを前後に揺らしています。
これらのコンポーネントでは Verse を使用して、ランタンが移動する経路、その経路上でランタンが移動する距離、および灯火を揺らす風を再現するためのランタンの回転を決定します。 キーフレーム移動コンポーネントは、simple_movement_component の座標に基づいてスムーズで連続した動きを作ります。
最後のライトポスト インスタンスでは、ライトポストにカスタム Verse lantern_interaction_component が、ランタンに interactable_component が追加されています。 プレイヤーがランタンに近付いてインタラクトすると、lantern_interaction_component によってライトポスト全体で各 light_component と particle_system_component の有効/無効が切り替わり、ランタンのオン/オフが変化します。
オーバーライド
プレハブをインスタンス化すると、インスタンスはインスタンス化元のプレハブ定義と同じデフォルト値で始まります。 では、いずれか 1 つのプレハブ インスタンスの特定の側面を変更したい場合は、どのようにすればよいでしょうか。 別の色のライトが必要な場合や、木製のライトポストではなくて金属製のポールにしたい場合などです。 ここでオーバーライドが役立ちます。
オーバーライドを利用すると、親プレハブを変更することなく、プレハブ クラスのインスタンスの値を変更して各インスタンスをカスタマイズできます。 プレハブのインスタンスでネスティングされているコンポーネントでオプションを変更すると、その変更で親プレハブのオプションがオーバーライドされ、そのインスタンスでのみ、そのコンポーネントの範囲でエンティティの挙動が影響を受けます。
個々のプレハブ インスタンスでオーバーライドと変更を行い、シーン内に多様性を生み出すことができます。 プレハブのインスタンスすべてに変更を反映する必要がある場合は、プレハブ エディタを使用してシーン内の全プレハブに変更を反映できます。
Scene Graph の Verse 機能
Scene Graph は Verse ネイティブ システムであり、両方を多くの強力な方法で活用できます。 プロジェクトで作成したプレハブは、「Assets.digest.verse」ファイルを通じて Verse でアセット クラスとして公開されます。 これを Verse コンポーネントと Verse の仕掛けの両方のコードで参照できます。
Verse を使用してシーン内の個々のエンティティとコンポーネントをクエリすることもできます。 GetComponents() 関数は、型に基づいて特定のコンポーネントを取得します。GetEntities() は特定の親の子エンティティをすべて返します。 Scene Graph 階層を上下に検索して、子孫エンティティと祖先エンティティを見つけることもできます。 このテンプレートで使用している P_LightPost プレハブでは、Verse を使用してランタンの揺れる動きとインタラクティブ性を作成しています。
機能的なゲーム オブジェクトの作成について詳しくは、次のセクション「移動とインタラクション」に進んでください。
移動とインタラクション
移動をエンティティに追加することで、Verse コンポーネントとキーフレーム移動コンポーネントが設定された機能的なゲーム オブジェクトを作成する方法について説明します。