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.cppFixedBox::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");

//中略
}
 とすると、アタックボールとプレイヤーは衝突しなくなります。