Unity備忘録14頁目「当たり判定」

江上宿六です。

 

当たり判定と書いてますけど割とあやふやな単語ですよね。 まぁ、衝突判定と

重なり判定をまとめて当たり判定と言うみたいなものだと思っていますが。

 

というわけで当たり判定です。 判定を行うにはRigidbodyとColliderが必要に

なりますが、CubeやSphereには最初からColliderがついています。 そして共に

Rigidbodyは追加しているのであとは判定をするだけなのですが、その前に

少しだけColliderを見てみましょう。

f:id:y6yegami:20180719114005p:plain

CubeについているCollider、BoxColliderです。 箱形のColliderでEditColliderを

クリックすると箱形になっているのがわかります。 Centerで中心点、Sizeで

サイズをそれぞれ変える事が出来ます。

f:id:y6yegami:20180719114644p:plain

f:id:y6yegami:20180719114653p:plain

試しにこんな風に値を変更してEditColliderを押すと、こんな風に判定を持つのが

わかると思います。 実際こんな風にする人は居ないでしょうけども。

IsTriggerという項目も大事なんですけど、そこは後回しにしておきます。

 

さて実際に判定を行っていきますが、そんなに難しくありません。

Cubeを操作するスクリプトを開き、記述していきます。

f:id:y6yegami:20180719115948p:plain

OnCollisionEnterという関数を作りました。 Colliderを持つオブジェクト同士が

衝突するとこの関数が呼ばれるので、この中に処理を書けば良いだけなのです。

引数で渡されたのが衝突したオブジェクトで、それを破棄するようにしています。

では実行してみましょう。

f:id:y6yegami:20180719120541p:plain

まぁ、非常に残念な事に床が破棄されてしまいました。 重力がかかると

一番最初に衝突するから当然ですが、まぁ、判定はちゃんと行われたわけです。

でも床には消えてもらいたくないので、区別して判定を行えるようにします。

 

メニューバーのEditからProjectSettings→TagsAndLayersを選択すると

インスペクターに表示されるのでTagsの所を開きます。

f:id:y6yegami:20180719124210p:plain

f:id:y6yegami:20180719124358p:plain

最初は何も入っていないので、+ボタンを押してPlane、Sphereという感じで

タグを作っていきます。 出来たらそれぞれオブジェクトにタグを設定します。

f:id:y6yegami:20180719124949p:plain

まずはPlaneを選択してインスペクター上部ののTagをクリックし、リストから

Planeを選択します。 続いてプロジェクトビューのSphereGeneratorを選択し、

同様にSphereを選択します、これでタグの設定が出来ました。 スクリプト

書き換えましょう。

f:id:y6yegami:20180719130605p:plain

衝突したオブジェクトのタグがSphereなら破棄する、という感じにしました。

f:id:y6yegami:20180719130947p:plain

実行すると床は破棄されずに残っており、CubeとSphereが衝突するとSphere

破棄されるようになりました。 後者は画像では分かりにくいですけども。

当たり判定はこんな感じでしょうか。

 

それでColliderのIsTriggerという項目なんですけども、これにチェックを入れると

衝突時に物理的な挙動が発生しなくなり、そのまま通り抜けていくようになります。

そしてオブジェクト同士が接触している間に判定を行ったりする事ができます。

f:id:y6yegami:20180719133217p:plain

 ↓

f:id:y6yegami:20180719133223p:plain

CubeのColliderのIsTriggerにチェックを入れ実行し、床に乗っかることなく

Cubeが落下していった時のログです。 IsTriggerにチェックを入れた場合は

それを判定する所の関数名もOnTriggerEnter等に変わるので注意です。

 

因みにでもなんでもないですが、OnCollisionの方にもStayとExitがあります。

Cubeが床に乗ってる時はCollisionStayが呼ばれる事になります。 Sphere

Destroyした時にはExitは発生していません。 という風に色々確認してみるのも

勉強になると思います。

 

今回はこんな感じで終わりです。 床を破棄してしまったのはガチの

アクシデントで、その流れでタグについても説明する事になってしまいました。