Keep your place in this quest

Log in or sign up for free to subscribe, follow lesson progress, and access more learning content.

Understanding Entities

さて、caveにおけるEntityの概念を理解しましょう。EntityはCaveシーン内の基本的なオブジェクトです。

シーンがレベル、メニュー、またはテストスペースだとすると、Entityはその空間内に存在するものです。例えば、プレイヤー、敵、ドア、ライト、カメラ、トリガー、UIボタン、サウンドソース、フォルダーなど、すべてがEntityになりえます。

このレッスンで学ぶ内容は以下の通りです:

  • 名前
  • ID
  • アクティブ状態
  • 親子関係 (Parenting)
  • フォルダー
  • 階層の順序
  • タグとプロパティ
  • テンプレートインスタンス

これらの詳細は小さなことのように聞こえますが、シーンが少数のオブジェクトから本格的なレベルへと成長するとき、大きな差を生みます。

Entityとは何か?

Entityはシーン内のオブジェクトです。

Entityは以下のようなものを表せます:

  • 目に見える3Dオブジェクト
  • 目に見えない補助的なもの
  • ゲームプレイ用のトリガー
  • UI要素
  • サウンドソース
  • または単に整理のためのフォルダー

image.png

例えば、木箱は目に見えるEntityです。スポーンポイントはプレイ中は見えないかもしれませんが、そこに何かが起こる場所を示すため、依然としてEntityです。

Caveはこの考え方をシンプルにしており、シーンはEntityから構築されます。

Entityはコンポーネントのコンテナ

Entity自体はほとんど何もしません。 機能はコンポーネントから得られます。例えば:

Entity 持ちうるコンポーネント
木箱 (Crate) Transform, Mesh, Rigid Body
プレイヤー (Player) Transform, Character, Camera, Python, Audio
ドア (Door) Transform, Mesh, Rigid Body, Logic Bricks
トーチ (Torch) Transform, Mesh, Light, Audio
ボタン (Button) Transform, UI Element, Logic Bricks または Python
---

これがEntityが柔軟である理由です。ドアは完全に別のハードコードされたオブジェクトタイプではなく、見るためのメッシュ、プレイヤーをブロックするための当たり判定、開閉のためのロジックというピースからできたEntityです。

これを理解すると、オブジェクト作成がより実用的になります。「どのオブジェクトタイプが必要か?」ではなく、「このEntityにどのコンポーネントが必要か?」を考えるようになるのです。

Entityの名前

すべてのEntityには名前があります。名前はScene Graphのクイック編集メニューやPropertiesタブから変更可能です。

名前は主に人間のためにつけられています:

  • Scene Graphのスキャンを容易にする
  • デバッグを簡単にする
  • チームメイトとのコミュニケーションを助ける
  • 自分自身が後でシーンを理解しやすくする

CaveではEntity名がユニークである必要はありません。 複数のEntityが同じ名前を共有でき、例えば岩やコイン、箱、敵など繰り返し使うオブジェクトに便利です。

ただし、名前だけをEntityの唯一かつ信頼できる識別子として使わないでください。

良い名前はシンプルで説明的です:

弱い名前 良い名前
Mesh 木製の木箱 (Wooden Crate)
Empty プレイヤースタート (Player Start)
Light 洞窟入口のライト (Cave Entrance Light)
Folder 敵グループ (Enemy Group)

目的は名前を凝ったものにすることではなく、シーンを読みやすくすることです。

Entity名はコード内で特定のEntityを呼び出すために使うこともできますが、複数のEntityが同じ名前を持つ場合、どのEntityが返されるか不定になることに注意してください。検索で最初に見つかったものが返されます。なので、例えばプレイヤーのように特定のオブジェクトをコード経由で確実に取得する必要がある場合は、一意の名前を付けるようにしましょう。

EntityのID

Caveは内部的にユニークなIDでEntityを管理しています。

通常はこれらのIDを編集したり気にする必要はありません。名前が重複していてもエンジンが確実にEntityを識別できるために存在します。実際、ユニークIDは不変であり、変更はできません。エンジンが自動的に割り当てます。

覚えておくべきこと:

目的
名前 あなたがシーンを読みやすくするため
ID Caveが内部でオブジェクトを管理するため

同じ名前の敵が二体いても、Caveは背後でそれらを区別できます。

Entityのアクティブ状態

Entityはアクティブまたは非アクティブ状態にできます。

image.png

Scene GraphPropertiesタブでは、目のアイコンスタイルのアクティブコントロールで表示されます。

状態 意味
アクティブ Entityがシーンに通常通り参加している
非アクティブ Entityはシーンに残るが無効化されている

Entityやそのコンポーネントによっては、無効化が影響するのは以下の通りです:

  • レンダリング
  • 物理演算
  • ロジック
  • ランタイム更新
  • コンポーネントの振る舞い

無効化されたEntityはコンポーネントのアップデートが一切呼ばれません。無効化するとコンポーネントの終了メソッドが呼ばれ、有効化すると開始メソッドが呼ばれます。

基本的に無効化されたEntityはシーンの物理計算やロジック、トリガーなどに貢献しません。もちろん、手動で無効化されたEntityをクエリして利用することは可能ですが、その場合は無効化を無視していることになります。

実用的にはシンプルに「非アクティブは『ここに残っているが現在は参加していない』」ということです。

無効化と削除の違い

無効化と削除は同じではありません。

操作 結果
無効化 (Disable) Entityをシーンに残しつつオフにする
削除 (Delete) Entityをシーンから完全に削除する

無効化は後で使うかもしれない場合に使い、削除は確実にEntityを消したいときに使います。

テストには無効化が安全なことが多いです。例えば敵が強すぎると思ったら、一部の敵を無効化してレベルをテストし、それで調整が決まれば後でシーンを整理できます。

Entityの親子関係 (Parenting)

Entityは他のEntityの子にすることができます。

Entityに親がいると、そのEntityは親の階層の一部になります。親を移動すれば子も一緒に移動します。

親子付けは以下のような場面で便利です:

  • キャラクターに装備された剣
  • トーチに付いたライト
  • 車に付いたカメラ
  • フォルダーにまとめられた小道具のグループ
  • 親パネルにまとめられたUI要素

親子関係はTransformにも影響します。子EntityのTransformは親の階層を基準に評価されます。

関連オブジェクトを一緒に管理する最も簡単な方法の一つです。

フォルダーEntity

フォルダーEntityは整理用に使います。特にシーンに多くのオブジェクトが増えてきた時に役立ちます。

定義として、フォルダーであるEntityはほぼコンポーネントを持たないこと、特にTransformやUI Elementコンポーネントが無いことが多いです。世界にTransformを持たず、UI要素もないEntityはフォルダーとして使われることが多いですが、これは主にネーミングの慣習ですので覚えておいてください。

よくあるフォルダーグループの例:

  • 環境 (Environment)
  • ゲームプレイトリガー (Gameplay Triggers)
  • 敵 (Enemies)
  • 小道具 (Props)
  • 照明 (Lighting)
  • UI
  • オーディオ (Audio)
  • デバッグヘルパー (Debug Helpers)

フォルダーは見た目だけの整頓ではありません。きれいなScene Graphは多くの散在したEntityを探す手間を省くため、作業スピードアップに繋がります。

Entityの階層の順序

Scene Graph内のEntityの順序は整理の面で重要で、場合によっては処理や表示に影響することもあります。

もしフォルダーを開いて次のような構造だと見にくいです:

Crate
Player
Light
Enemy
Camera
Rock
Trigger

しかし次のように整理されていると見やすいです:

Player
Camera
Lighting
Enemies
Environment
Gameplay Triggers

目的は階層を派手にすることではなく、有用にすることです。

離れて1週間後にシーンを開いてもすぐ重要なオブジェクトの場所がわかれば、階層はうまく機能しています。

重要な注意点: エンジン内部の最適化のため、親を持たない(トップレベル)Entityの表示順はランダムになることがあります。他方、子Entityは特定の順序を持ち、エディタで個別のEntityを右クリックして上下や最上部・最下部に移動させることが可能です。

Entityのプロパティとタグ

Entityはカスタムプロパティとタグを保持できます。

機能 目的
プロパティ 編集可能な値を保持する
タグ 識別やグループ化のラベルを追加する

例えば敵は次のようなものを持つかもしれません:

  • Damageableタグ
  • healthプロパティ
  • teamプロパティ
  • patrolRadiusプロパティ

スクリプトやロジックはこれらを利用して動作を決定します。

ダメージシステムはDamageableタグを持つEntityを探すかもしれません。敵のスクリプトはpatrolRadiusを読み取って敵がどこまで巡回できるか判断します。

プロパティやタグは、小さなデータごとに特別なコンポーネントを作る必要なく、ゲームプレイの意味合いをEntityに付与できます。

タグはプロパティよりもクエリが速いため、例えばダメージを受けられる敵を特定するのに適しています。ただしタグは値を持ちません。プロパティは値を持ちますがクエリは遅いです。コード的にはEntityのプロパティはPythonの辞書と同じものです。

Entityテンプレートのプレビュー

一部のEntityはEntityテンプレートのインスタンスです。例えばデフォルトの新しいCaveプロジェクトにあるプレイヤーは、このテンプレートのインスタンスです:

image.png

テンプレートインスタンスはScene GraphでCaveのテンプレート色を使って異なる表示になります。これによりそのEntityが再利用可能なテンプレートアセットから来ていることが分かりやすくなります。

Entityがテンプレートインスタンスであるとき:

  • その内部の子はテンプレートに属しています。
  • 配置されたインスタンスはシーンに属しています。
  • テンプレートの構造はテンプレートアセットを開いて編集します。
  • ローカルの値は、プロパティとして公開されている場合は調整可能です。

次のレッスンでは、Entity Templatesについてより詳しく説明します。

エンティティのメンタルモデル

エンティティを小さなコンテナのように考えてください:

  • 名前は理解の助けになります。
  • IDはCaveが追跡するためのものです。
  • アクティブ状態は参加するかどうかを制御します。
  • 親はどこに属しているかを決めます。
  • コンポーネントは何をするかを定義します。
  • プロパティとタグは追加のゲームプレイデータを表します。

これがCaveにおけるシーン構築のコアです。

エンティティの理解が進むと、シーングラフは単なるオブジェクトのリストではなくなります。ゲーム世界の構造となるのです。