当たり判定ってどこに置くの???
当たり判定ってどこからに置いておけばいいのかわからない…
下手なところに置くと
余計な情報の受け渡しや1オブジェクトごとに当たり判定処理を作らなければいけない
ことになってしまう。
当たり判定に必要のない情報を持ってくると保守性の問題が出るし、
PlayerやEnemyを始め、オブジェクトごとに判定用の処理を作ると面倒…
そうだ、当たり判定の情報だけをまとめれば良くね?
どこに置くのも微妙ならそれ専用の管理用クラスを作って専用で管理させよう!!
そのために管理クラスに渡す情報をまとめた、当たり判定情報クラス「コライダ」を作る。
コライダの作成
…ということで、まずはいろいろ必要な要素を出していこう。
・位置
・回転
・大きさ
・持ち主(constで持っておくこと!!)
このくらい持っておけばいいかなー
保持した位置からこのくらい回転して、このくらいの大きさの範囲で、
当たったら持ち主に伝える…
…ってそういえば!!
そもそも当たり判定ってどんな形だっけ?
そもそも位置とかが分かっても判定の形状が分からなければ始まらない!!
そいつが球体なのか、箱型なのか知ってなければいけなかった!!
でも共通で判定を取りたい…ならば!!
形状クラスを作って、継承クラスとして保持する
コライダで保持するための形状情報もまとめておこう!!
位置や大きさもここにまとめておくことにする。
形状固有の要素は継承先でそれぞれまとめておく。
球体だったら半径が分かればよくて、線分だったら二つの相対位置
のように各形状に必要な情報をまとめる。
これで全ての必要な情報が分かった!!
管理クラスで一括管理する
残りの手順は、
1.オブジェクトにコライダを持たせ、管理クラスに共有させる。
2.管理クラスの方でそれぞれ情報を使い、当たったかどうかを確認する。
3.当たったのなら持ち主に当たったことを伝える。
という流れ。
- 1.オブジェクトにコライダを持たせ、管理クラスに共有させる。
- これは、オブジェクトから管理クラスにコライダをポインタで渡すだけ。
- 2.管理クラスの方でそれぞれ情報を使い、当たったかどうかを確認する。
- 渡ってきたコライダ情報を用いて、双方の当たり判定を取る。
- 3.当たったのなら持ち主に当たったことを伝える。
- 当たったことが分かったら、持ち主に当たったことを伝えるようにコライダに命令を出す。
これでどれだけオブジェクトを追加しても一括で管理ができるようになった!!
と思ったけどまだ足りないことが…
誰と当たったかの判断
管理クラスはコライダ同士が当たったかどうかしか判定してくれないので、誰が誰と当たったかなんて知ったこっちゃない!!
これではプレイヤーは敵と当たったのかアイテムと当たったのかを判断できない…
タグ
コライダに「タグ」をつけようタグとは、簡単に言えば名札みたいなもので、プレイヤーにはPlayerという名前のタグを渡しておく、そうすることで誰なのかの区別が簡単につく!!
タグの追加も列挙型等でしておけば追加も簡単!!
これでやっと当たり判定管理の完了!!
終わりに
まず、このような投稿にまだまだ慣れておらずわかりにくいところだらけで申し訳ございません。こんなことをしている、したいんだな程度に考えていただければ幸いです。
そして、まだまだ当たり判定は終わってません。
あくまでこれは当たるまでのことを書いたので当たった後の色々に関してはまだまだ足りていないのでこれからもここ周りは頑張っていきたいと思います。この管理方法は、いろんな方にアドバイスをいただいて、自分なりに解釈しながら制作したので私自身、完璧にできているとは言えないので参考程度にしていただければと思います。
ここまで見ていただきありがとうございました。



