04.コンポーネントと行動

コンポーネントと行動(Behavior)の違い

 GameObjectにはコンポーネント行動(Behavior)を設置することができます。
 コンポーネントは、一般的にはそのオブジェクトに永続的に影響を与える(時により無効にすることができるが)オブジェクトであり、行動(Behavior)は、影響を受けたり受けなかったりできるオブジェクトと考えることができます。
 たとえばCollisionSphereという球体の衝突判定コンポーネントがあります。これは、一般的に常に実装されるものであり、場合によってはSetUpdateActive(false)によって無効にもできます。
 行動の例としてはSeekSteeringがあります。目標に向かって追いかける行動ですが、ある条件下ででのみExecute()(実行する)という方法で装着します。つまり装着した行動を実行してはじめて、影響を受ける形になります。

コンポーネント

 コンポーネントUpdate系コンポーネントDraw系コンポーネントがあります。
AddComponent<コンポーネント名>(引数(必要なら));
 という書式で装着できます。主にOnCreate()仮想関数で実装します。
 ただしTransformコンポーネントだけは、すべてのGameObjectがデフォルトで装着されます。ですのでTransformコンポーネントAddComponentは必要ありません。
 実装したコンポーネントは
GetComponent<コンポーネント名>();
 で取得できます。
 前述しましたがTransformコンポーネントだけは、いきなりGetComponent<Transform>();を呼び出せます。

 Draw系コンポーネントは頂点定義やシェーダによって別々のコンポーネントがあり、数も多いのでここで紹介するのは荷が重いので、描画処理の説明のところで説明します。
 ここではUpdate系コンポーネントについて説明します。以下はライブラリが持っている主なUpdate系コンポーネントです。
コンポーネント名 用途 備考
Transform オブジェクトのスケーリング、回転、位置、及びワールド行列を所持する 必ず実装される
Gravity 重力を管理する Rigidbodyとは共存できない
CollisionSphere 球体の衝突判定 AfterCollisionがNone以外の場合は、Rigidbodyとは共存できない
CollisionObb ボックスの衝突判定 AfterCollisionがNone以外の場合は、Rigidbodyとは共存できない
CollisionCapsule カプセルの衝突判定 AfterCollisionがNone以外の場合は、Rigidbodyとは共存できない
Rigidbody 物理計算 GravityあるいはAfterCollisionがNone以外のCollisionとは共存できない
StringSprite() デバッグ用文字列

 これらはライブラリに含まれるコンポーネントですが、コンポーネントは自作することができます。Update系コンポーネントの場合はComponentの派生クラスをとして作成するとよいでしょう。
 Draw系コンポーネントの場合はDrawComponentの派生クラスとして作成するとよいでしょう。

行動(Behavior)

 ライブラリに含まれる行動(Behavior)には以下の表のようなものがあります。行動を実装する場合は
auto Ptr = GetBehavior<行動名>();
 で行動のポインタを取得し
Ptr->Execute(引数);
 で行動を実装します(一部例外もあります)。この場合の引数は行動によってまちまちです。Execute()関数が呼ばれるまで、その行動の影響は受けません。
 以下がライブラリ中の主な行動です。
行動名 用途 備考
SeekSteering 目標を追いかける
ArriveSteering 目標に到着する
WallAvoidanceSteering 壁を回避する
ObstacleAvoidanceSteering 障害物を回避する
FollowPathSteering 経路追従
AlignmentSteering 整列
CohesionSteering 結合
SeparationSteering 分離(お互い離れる)

 行動も自作できます。自作する場合はBehaviorの派生クラスを作るとよいでしょう。
 その場合Excute()関数を作成しておくと、コードに統一が取れると思います。