当たり判定にはいくつか種類があるが、ここでは一番単純な「球と球の判定」機能を追加していく。
当たり判定の処理を作っても相手がいないと試せないので、敵を作っておこう。
(去年シューティングゲーム作った時と同じ)
必要な機能をまとめたクラスを作成する。
球の当たり判定をするためには「中心位置」と「半径」の情報が必要。
「中心位置」に関しては、とりあえずそのオブジェクトのtransform_.positionを当たり判定の中心とする。
ということでメンバ変数は半径を入れる変数だけあればOK
去年のエンジンと同様に、コンストラクタで「半径」を指定できるようにしておこう。
<参考>
あと、半径のゲッターも作っておく。
※ちなみに、コライダーはゲームに直接出てくるわけではないので「ゲームオブジェクト」とは言わない。
したがってGameObject関数を継承しない。
このような「ゲームオブジェクトに追加する機能」のようなものを『コンポーネント』と言ったりする。
ゲームオブジェクトに当たり判定を持たせられるようにする。
GameObjectクラスにSphereCollider型のポインタを宣言すればいい。
これがnullptrなら当たり判定無し、何か入ってたら当たり判定あり とする。
あとはAddColliderと言う名前で、上の変数のセッターを作る。
<参考>
で、弾と敵にコライダーを付ける。
※将来的には、ひとつのゲームオブジェクトに複数のコライダーをアタッチできるようにしていくと良い。
その場合は今回作ったポインタを配列にすればいい。
いよいよ当たってるかどうか判定する関数を作る。
GameObjectクラスに『Collision』と言う関数を用意する。
・引数はGameObject型のポインタ
・自分と、引数で渡されたオブジェクトの当たり判定を行う
(自分の位置、相手の位置、自分のコライダーの半径、相手のコライダーの半径 が分かればできるはず)
・当たった時に何をするかはまだ決まってないので、とりあえずブレ―ポイントを付けておく。
引数に「相手」のアドレスを渡してCollison関数を呼べば、自分と相手の当たり判定をするようになった。
では、誰と当たり判定を行うかというと・・・・全員と行う。
FindObject関数を作った時に学んだ事を活かせば、全オブジェクトとの当たり判定ができるはず。
(ヒント)
GameObject型のポインタを引数に持った関数を用意する。
引数で受け取ったアドレスをそのまま引数としてCollison関数を呼ぶ。
引数で受け取ったオブジェクトの子供の数の分だけループし、各子供を引数として上で作った関数を呼ぶ
その関数をUpdateSub関数から呼ぶ。その時、引数にはRootJobを渡す。
自分との当たり判定をしないように注意。
コライダーを持ってない場合は当たり判定無し。
自分がコライダー持ってなくても、子供は持ってる場合もあるので注意
ここまで作って実行し、弾が敵に当たった時にブレークポイントで止まればOK。
各ゲームオブジェクトのクラスにOnCollisionという関数を作っておくと、何かにぶつかった時にこれが呼ばれる仕組みになっていた。
<参考>
これはどういう仕組み?
(ヒント)純粋じゃない仮想関数