江上宿六です。
当たり判定と書いてますけど割とあやふやな単語ですよね。 まぁ、衝突判定と
重なり判定をまとめて当たり判定と言うみたいなものだと思っていますが。
というわけで当たり判定です。 判定を行うにはRigidbodyとColliderが必要に
なりますが、CubeやSphereには最初からColliderがついています。 そして共に
Rigidbodyは追加しているのであとは判定をするだけなのですが、その前に
少しだけColliderを見てみましょう。
CubeについているCollider、BoxColliderです。 箱形のColliderでEditColliderを
クリックすると箱形になっているのがわかります。 Centerで中心点、Sizeで
サイズをそれぞれ変える事が出来ます。
↓
試しにこんな風に値を変更してEditColliderを押すと、こんな風に判定を持つのが
わかると思います。 実際こんな風にする人は居ないでしょうけども。
IsTriggerという項目も大事なんですけど、そこは後回しにしておきます。
さて実際に判定を行っていきますが、そんなに難しくありません。
Cubeを操作するスクリプトを開き、記述していきます。
OnCollisionEnterという関数を作りました。 Colliderを持つオブジェクト同士が
衝突するとこの関数が呼ばれるので、この中に処理を書けば良いだけなのです。
引数で渡されたのが衝突したオブジェクトで、それを破棄するようにしています。
では実行してみましょう。
まぁ、非常に残念な事に床が破棄されてしまいました。 重力がかかると
一番最初に衝突するから当然ですが、まぁ、判定はちゃんと行われたわけです。
でも床には消えてもらいたくないので、区別して判定を行えるようにします。
メニューバーのEditからProjectSettings→TagsAndLayersを選択すると
インスペクターに表示されるのでTagsの所を開きます。
↓
最初は何も入っていないので、+ボタンを押してPlane、Sphereという感じで
タグを作っていきます。 出来たらそれぞれオブジェクトにタグを設定します。
まずはPlaneを選択してインスペクター上部ののTagをクリックし、リストから
Planeを選択します。 続いてプロジェクトビューのSphereGeneratorを選択し、
同様にSphereを選択します、これでタグの設定が出来ました。 スクリプトも
書き換えましょう。
衝突したオブジェクトのタグがSphereなら破棄する、という感じにしました。
実行すると床は破棄されずに残っており、CubeとSphereが衝突するとSphereが
破棄されるようになりました。 後者は画像では分かりにくいですけども。
当たり判定はこんな感じでしょうか。
それでColliderのIsTriggerという項目なんですけども、これにチェックを入れると
衝突時に物理的な挙動が発生しなくなり、そのまま通り抜けていくようになります。
そしてオブジェクト同士が接触している間に判定を行ったりする事ができます。
↓
CubeのColliderのIsTriggerにチェックを入れ実行し、床に乗っかることなく
Cubeが落下していった時のログです。 IsTriggerにチェックを入れた場合は
それを判定する所の関数名もOnTriggerEnter等に変わるので注意です。
因みにでもなんでもないですが、OnCollisionの方にもStayとExitがあります。
Cubeが床に乗ってる時はCollisionStayが呼ばれる事になります。 Sphereを
Destroyした時にはExitは発生していません。 という風に色々確認してみるのも
勉強になると思います。
今回はこんな感じで終わりです。 床を破棄してしまったのはガチの
アクシデントで、その流れでタグについても説明する事になってしまいました。