305.衝突判定コンポーネント
BaseCrossの衝突判定
BaseCrossでは
球体、直方体、カプセルの
境界ボリュームを扱うことができます。これらの形状は、移動により何かと衝突し、反作用を起こします。また、
矩形、三角形の集合という追加の形状があり、これらは、反作用を起こすようには設定できませんが、境界ボリュームと衝突させることができます。
この
反作用を起こすような設定というのは
Fixedというフラグです。
Fixedが真になってる形状同士は衝突判定は行いません。一方、
Fixedが
偽になっている形状は
Fixedが真の形状と衝突すると、
反発もしくは
スライスという反応を起こします。
Fixedが
偽になっている形状同士の衝突は、お互いに
反発もしくは
スライスします。
つまり
Fixedというのは
衝突しても影響を受けないという意味です。例えば、
移動する床があった場合、何かがそれに衝突しても、その移動には影響を受けません。これが
Fixedが真です。
一方
Fixedが偽になっている場合、
何かに衝突した場合、その反動が起こるという意味です。
これらを表にまとめると以下のようになります。
形状 |
Fixed |
球体(CollisionSphere) |
真または偽 |
カプセル(CollisionCapsule) |
真または偽 |
直方体(CollisionObb) |
真または偽 |
三角形の集合(CollisionTriangles) |
つねに真 |
矩形(CollisionRect) |
つねに真 |
このように
球体、直方体、カプセルはどちらにも設定できますが
矩形、三角形の集合は
Fixedが真にしか設定できません。つまり
矩形、三角形の集合は
ゲーム盤や
でこぼこ床に設定する形状と考えられます。
衝突判定を実装する
衝突判定コンポーネントを実装した例は
FullSample305にあります。このサンプルは
FullSample304の衝突判定をコンポーネントを使って実装した例です。
以下に違うコードを述べます。
まず、
Player.cppにある、
AttackBall::OnCreate()関数に以下を記述します。
//初期化
void AttackBall::OnCreate() {
//中略
//CollisionSphere衝突判定を付ける
auto PtrColl = AddComponent<CollisionSphere>();
//中略
}
そして、
AttackBall::OnUpdate2()関数は無くします。
プレイヤーは、
Player::OnCreate()関数で
//初期化
void Player::OnCreate() {
//中略
//CollisionSphere衝突判定を付ける
auto PtrColl = AddComponent<CollisionSphere>();
PtrColl->SetIsHitAction(IsHitAction::Auto);
//中略
}
ここで
SetIsHitActionで設定しているのは、何かの上に乗ったときの処理です。アタックボールとは違い、ボックスに乗った場合などを想定してこの設定にしています。
また
Player::OnUpdate2()関数は無くします。
最後に
Character.cppの
FixedBox::OnCreate()関数です。
//初期化
void FixedBox::OnCreate() {
//中略
//OBB衝突j判定を付ける
auto PtrColl = AddComponent<CollisionObb>();
PtrColl->SetFixed(true);
//中略
}
ここでは
SetFixed(true)としています。この設定でボックスは
衝突するがほかの影響は受けない設定になります。
以上で終了です。プレイヤーはボックスと衝突しますし、アタックボールも衝突します。
衝突したくない相手の設定
このサンプルの前項との違いは、
プレイヤーとアタックボールも衝突するところです。
アタックボールがプレイヤーの武器と考えるなら、たとえばプレイヤーには影響を与えたくないとしたら、
AttackBall::OnCreate()関数で
//初期化
void AttackBall::OnCreate() {
//中略
AddTag(L"AttackBall");
//中略
}
と
タグを追加しておいて、
Player::OnCreate()関数で
//初期化
void Player::OnCreate() {
//中略
//CollisionSphere衝突判定を付ける
auto PtrColl = AddComponent<CollisionSphere>();
//衝突しないタグの設定
PtrColl->AddExcludeCollisionTag(L"AttackBall");
//中略
}
とすると、アタックボールとプレイヤーは衝突しなくなります。