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<行動名>();
で行動のポインタを取得し
で
行動を実装します(一部例外もあります)。この場合の
引数は行動によってまちまちです。
Execute()関数が呼ばれるまで、その行動の影響は受けません。
以下がライブラリ中の主な
行動です。
行動名 |
用途 |
備考 |
SeekSteering |
目標を追いかける |
|
ArriveSteering |
目標に到着する |
|
WallAvoidanceSteering |
壁を回避する |
|
ObstacleAvoidanceSteering |
障害物を回避する |
|
FollowPathSteering |
経路追従 |
|
AlignmentSteering |
整列 |
|
CohesionSteering |
結合 |
|
SeparationSteering |
分離(お互い離れる) |
|
行動も自作できます。自作する場合は
Behaviorの派生クラスを作るとよいでしょう。
その場合
Excute()関数を作成しておくと、コードに統一が取れると思います。