Keep your place in this quest

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

Entitiesの理解

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

シーンがレベル、メニュー、またはテストスペースである場合、エンティティはそのスペース内に存在するものです。例えば、プレイヤー、敵、ドア、ライト、カメラ、トリガー、UIボタン、音源、フォルダーなど、すべてがエンティティになり得ます。

このレッスンでは、次のことを学びます:

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

これらの詳細は小さなことに思えるかもしれませんが、シーンが数個のオブジェクトから本格的なレベルに成長する際には、大きな違いを生み出します。

エンティティとは?

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

エンティティは以下を表すことができます:

  • 可視の3Dオブジェクト。
  • 見えないヘルパー。
  • ゲームプレイのトリガー。
  • UI要素。
  • 音源。
  • 単に整理のために使われるフォルダー。

image.png

例えば、木箱は可視のエンティティです。スポーンポイントはゲームプレイ中に見えないかもしれませんが、何かが起こるべき場所を示すため、依然としてエンティティです。

Caveはこの考えをシンプルに保っています:シーンはエンティティから構築されます。

エンティティはコンポーネントコンテナ

エンティティは単独ではあまり機能しません。その機能はコンポーネントから来ます。例えば:

エンティティ それが持つかもしれないコンポーネント
クレート トランスフォーム、メッシュ、剛体。
プレイヤー トランスフォーム、キャラクター、カメラ、Python、オーディオ。
ドア トランスフォーム、メッシュ、剛体、ロジックブロック。
トーチ トランスフォーム、メッシュ、ライト、オーディオ。
ボタン トランスフォーム、UI要素、ロジックブロックまたはPython。
---

これがエンティティを柔軟にしている理由です。ドアは完全に別個のハードコードされたオブジェクトタイプではありません。それは、見るためのメッシュ、プレイヤーをブロックするための衝突、開閉するためのロジックから構成されたエンティティです。

このことを理解すれば、オブジェクトの構築がより実用的になります。「どのオブジェクトタイプが必要ですか?」という質問をするのではなく、「このエンティティにはどのコンポーネントが必要ですか?」という質問をするようになります。

エンティティ名

すべてのエンティティには名前があります。Scene Graphのクイック編集メニューやPropertiesタブからエンティティの名前を変更できます。

名前はまず人間のためのものであることを覚えておく価値があります:

  • シーングラフのスキャンが容易になります。
  • デバッグが簡単になります。
  • チームメイトとのオブジェクトについての会話が楽になります。
  • 後で自分のシーンを理解するのに役立ちます。

Caveはすべてのエンティティ名が一意であることを要求しません。複数のエンティティが同じ名前を共有することが可能であり、岩、コイン、クレート、敵などの繰り返しオブジェクトにとって便利です。

しかし、名前をエンティティの唯一の信頼できる識別子として扱わないでください。

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

弱い名前 より良い名前
Mesh Wooden Crate
Empty Player Start
Light Cave Entrance Light
Folder Enemy Group

目標は、名前を華やかにすることではありません。目標はシーンを可読性のあるものにすることです。

エンティティ名は、コード内で特定のエンティティをシーンから取得するためにも使用できますが、複数のエンティティが同じ名前を持つことができることをすでに知っているので、名前でエンティティを取得する際には、同じ名前のエンティティが複数存在する場合、いくつかの未定義の動作を引き起こす可能性があることを理解しておく必要があります。指定された名前に対して、シーンが返すエンティティがどれかは保証されないためです。シーン内でクエリを検索するときに最初に見つかったものを返します。したがって、特定のオブジェクトをコードで取得することが重要である場合(プレイヤーなど)、ユニークな名前を必ず付けてください。

エンティティID

Caveはエンティティを内部的に一意のIDで追跡します。

通常、これらのIDを編集したり心配したりする必要はありません。それらは、エンジンが重複する名前であってもエンティティを確実に識別できるように存在します。実際、一意のIDは不変であり、つまり変更することはできません。エンジンによって自動的に割り当てられます。

これを覚えておいてください:

物事 目的
名前 シーンを読みやすくします。
ID Caveがオブジェクトを内部で追跡するのを助けます。

もし2つの敵が両方ともEnemyという名前であっても、Caveは背後でそれらを区別できます。

エンティティのアクティブ状態

エンティティはアクティブまたは非アクティブになれます。

image.png

Scene GraphおよびPropertiesタブでは、目の形をしたアクティブコントロールで示されます。

状態 意味
アクティブ エンティティは通常シーンに参加します。
非アクティブ エンティティはシーン内に留まりますが、無効になります。

エンティティやそのコンポーネントによっては、無効にすると以下に影響を及ぼすことがあります:

  • 描画。
  • 物理。
  • ロジック。
  • ランタイム更新。
  • コンポーネントの動作。

無効なエンティティでは、そのコンポーネント更新は一切呼び出されず、エンティティを無効にすると同時にコンポーネントの終了メソッドが呼び出され、再度有効にすると、コンポーネントの開始メソッドが呼び出されます。

無効なエンティティは、シーンの物理計算、ロジック、トリガーなどに寄与しないと安全に仮定できます。もちろん、シーンからそれらのエンティティを手動でクエリし、無効であることを無視する場合を除いて。

実用的な考えはシンプルです:非アクティブは「ここにあるが、現在は参加していない」を意味します。

無効化と削除

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

アクション 結果
無効化 エンティティをシーン内に保持しつつ無効にします。
削除 エンティティをシーンから取り除きます。

後で再利用を考えている場合は、エンティティを無効にしてください。確実に取り除くべきとわかっている場合は、エンティティを削除してください。

テストのためには、無効化がよく安全です。敵との遭遇が難しすぎると感じた場合、最初にいくつかの敵を無効にしてレベルをテストします。その変更が適切に感じられたら、後でシーンを整理できます。

エンティティの親子関係

エンティティは他のエンティティに親子付けできます。

エンティティが親を持つと、その親の階層の一部になります。親を移動させると、子供もその移動に従います。

親子関係は以下に便利です:

  • キャラクターに取り付けられた剣。
  • トーチに取り付けられたライト。
  • 車両に取り付けられたカメラ。
  • フォルダー内で整理された小道具のグループ。
  • 親パネル内でグループ化されたUI要素。

親子関係はトランスフォームにも影響を及ぼします。子エンティティのトランスフォームは、親階層に対して評価されます。

これは、関連するオブジェクトをまとめて保持する最も簡単な方法の一つです。

フォルダーエンティティ

フォルダーエンティティは、整理のために使用されます。シーンが多くのオブジェクトを含むようになると、特に役立ちます。

定義上、エンティティをフォルダーにする要因はほとんどコンポーネントの欠如、特にワールド内のトランスフォームとUIエレメントコンポーネントです。エンティティにワールドのトランスフォームがなく、UIエレメントがない場合、フォルダーとして使用される可能性が高いです。しかし、それは主に命名の慣例なので、その点を考慮してください。

一般的なフォルダーグループには:

  • 環境。
  • ゲームプレイトリガー。
  • 敵。
  • 小道具。
  • 照明。
  • UI。
  • オーディオ。
  • デバッグヘルパー。

フォルダーは整理だけではありません。きれいなシーングラフは、数百の散在するエンティティの中から必要なオブジェクトをすばやく見つけることができるため、作業をより迅速にします。

エンティティ階層の順序

Scene Graph内のエンティティの順序は、整理にとって重要であり、場合によっては処理や表示方法に影響を与えることがあります。

フォルダーを開いて下記の構造を見ると、これはスキャンが難しいです:

クレート
プレイヤー
ライト
敵
カメラ
岩
トリガー

しかし、こちらはスキャンしやすいです:

プレイヤー
カメラ
照明
敵
環境
ゲームプレイトリガー

目標は階層を華やかにすることではなく、役立つものにすることです。

もし、一週間離れた後にシーンを開いて重要なオブジェクトの場所をすぐに理解できるなら、あなたの階層はその仕事をしています。

ここで重要な注意点: エンジンが内部のシーングラフを最適化する方法のため、親を持たない状態でエンティティが出現する順序はランダムですが、子エンティティ、つまり子供は特定の順序を持ち、エディタ内でそれぞれのエンティティを右クリックして上に移動、下に移動、最上部または最下部に移動させることによって整理できます。

エンティティプロパティとタグ

エンティティはカスタムプロパティとタグを保存できます。

特徴 目的
プロパティ 編集可能な値を保存。
タグ 識別またはグルーピングに使用されるラベルを追加。

例えば、敵は以下を持つ可能性があります:

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

スクリプトやロジックはこのデータを使用して決定を下すことができます。

ダメージシステムは、Damageableタグを持つエンティティを探すかもしれません。敵スクリプトは、patrolRadiusを読み取ってどれくらい遠くまで敵がうろつけるかを決定するかもしれません。

プロパティとタグは、特別なコンポーネントを必要とせずにエンティティにゲームプレイの意味を付与できます。

タグはプロパティよりもクエリが早いため、ダメージを受けることができるエンティティや敵を識別するために優れています。しかし、タグ自身には値がありません。プロパティはクエリが遅いですが、値を追加できます。コーディングの観点から見ると、エンティティプロパティは文字通りPython辞書です。

エンティティテンプレートプレビュー

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

image.png

テンプレートインスタンスは、Caveのテンプレートカラーを使用してシーングラフで異なる表示をされます。これにより、エンティティが再利用可能なテンプレートアセットから来ていることを認識できます。

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

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

次のレッスンでは、エンティティテンプレートについて詳しく説明します。

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

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

  • 名前はそれを理解する手助けをします。
  • IDはCaveがそれを追跡するのを助けます。
  • アクティブ状態は、それが参加するかどうかを制御します。
  • 親はそれがどこに属するかを制御します。
  • コンポーネントはそれが何をするかを定義します。
  • プロパティとタグは追加のゲームプレイデータを説明します。

それがCaveにおけるシーン構築の核心です。

エンティティが理解できるようになると、シーングラフは単なるオブジェクトのリスト以上のものになります。それはあなたのゲーム世界の構造になります。