Cave: はじめてガイド
Cave:入門ガイド
Lesson 9 of 19 • 25 XP
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要素
- サウンドソース
- または単に整理のためのフォルダー

例えば、木箱は目に見える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はアクティブまたは非アクティブ状態にできます。

Scene GraphやPropertiesタブでは、目のアイコンスタイルのアクティブコントロールで表示されます。
| 状態 | 意味 |
|---|---|
| アクティブ | 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プロジェクトにあるプレイヤーは、このテンプレートのインスタンスです:

テンプレートインスタンスはScene GraphでCaveのテンプレート色を使って異なる表示になります。これによりそのEntityが再利用可能なテンプレートアセットから来ていることが分かりやすくなります。
Entityがテンプレートインスタンスであるとき:
- その内部の子はテンプレートに属しています。
- 配置されたインスタンスはシーンに属しています。
- テンプレートの構造はテンプレートアセットを開いて編集します。
- ローカルの値は、プロパティとして公開されている場合は調整可能です。
次のレッスンでは、Entity Templatesについてより詳しく説明します。
エンティティのメンタルモデル
エンティティを小さなコンテナのように考えてください:
- 名前は理解の助けになります。
- IDはCaveが追跡するためのものです。
- アクティブ状態は参加するかどうかを制御します。
- 親はどこに属しているかを決めます。
- コンポーネントは何をするかを定義します。
- プロパティとタグは追加のゲームプレイデータを表します。
これがCaveにおけるシーン構築のコアです。
エンティティの理解が進むと、シーングラフは単なるオブジェクトのリストではなくなります。ゲーム世界の構造となるのです。