どうも、ナッツパパです(^^)
本記事では、Unityで度々登場する【Collision】と【Collider】について、初心者向けに解説していきます。
衝突した相手ゲームオブジェクトのあらゆる情報が入っている箱(クラス)のこと。
※ゲームオブジェクト同士が衝突して初めて作られる
▼使用方法
衝突イベントが発生した時に呼ばれる関数(OnCollisionEnterなど)をスクリプトファイルに書き込み、その関数の引数に【Collision】が入るようになっている。
そして、【Collision】の中の情報を取得し、if文で条件分岐を行い、ゲームオブジェクトに動きを付けていきます。
ゲームオブジェクトの衝突範囲の情報が入っている箱(クラス)のこと。
※基本的には、ゲームオブジェクトを生成した段階で、自動的にInspectorウィンドウ内に作られる。コンポネントとも言います。
▼使用用途
①衝突範囲の設定
②ゲームオブジェクト同士の衝突判定や重なり判定を制御する
※ゲームオブジェクト同士の衝突があった場合、『Collisionクラス』の中に、『Colliderクラス』の情報も組み込まれる。
最初にまとめてみました。
両方とも、Unity側が用意してくれている【UnityEngine】というオブジェクトの中で定義されているクラスになります。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class NewBehaviourScript : MonoBehaviour { // Start is called before the first frame update void Start() { } // Update is called once per frame void Update() { } }
上のスクリプトファイル初期コードの3行目で【UnityEngine】オブジェクトを呼び出していますね。
これで、【UnityEngine】オブジェクトの中のクラスや関数が使えるようになっているというわけです。
そして、【UnityEngine】オブジェクト内の数多くあるクラスの中でも、特別待遇のクラスが存在します。
それは、スクリプトファイルに何もコードを書かなくても、最初からInspectorウィンドウ内に自動的に生成されるクラスのことで、『transformクラス』や『mesh rendererクラス』、そして本記事で紹介する『Colliderクラス』もその一つです。
そして、『Collisionクラス』に関しては、特別待遇ではないので、スクリプトファイルにコードを書き込み、呼び出す必要があるのです。
よく似た言葉だけど全く意味は違います。
これからもっと詳しく解説していきますね(^^)
気軽に見ていって下さい♪
Collisionとは?
改めて【Collision】とは、衝突した相手ゲームオブジェクトのあらゆる情報が入っている箱(クラス)のことでしたね。
ではまず、【Collision】にはどんな情報が入っているのかを見ていきましょう。
Collisionクラスの中身
▼下にCollisionにどんな情報が入っているのかまとめていきます。
transform
衝突したオブジェクトの【transform(コンポネント)】情報が格納されている。
gameObject
衝突したオブジェクトの名前やタグ情報が格納されている。
collision.gameObject.CompareTag(“タグ名“)と書くと、衝突した相手のタグ名を確認できます!
collider
衝突したオブジェクトの【Collider(コンポネント)】情報が格納される。
Rigidbody
衝突したオブジェクトの【Rigidbody(コンポネント)】情報が格納される。
articulationBody
衝突したオブジェクトの【articulation Body(コンポネント)】情報が格納される。
body
衝突したオブジェクトに、【Rigidbody】か【articulationBody】が紐づけられているかどうかが格納されている。紐づけられていない場合はnullを返す。
ちなみに、【Rigidbody】と【articulationBody】は、どちらか1つしかゲームオブジェクトに紐づけることは出来ません。
contactCount
オブジェクトの衝突回数が格納される(int型で)
relativeVelocity
衝突相手の速度が格納される。
相手の速度が早ければ早いほど、オブジェクト同士の衝突の勢いが激しくなります。
・衝突の勢いに応じて、衝突音を変化させる
・衝突の勢いに応じて、オブジェクトを破壊する など
▼relativeVelocityに関しては、下の記事で詳しく解説しています
impulse
衝突によって発生した、衝撃の値が格納される。
・ある一定以上の衝撃が起きた時にイベントを発生させる
・ある一定以上の衝撃が起きた時に効果音をつける など
▼impulseに関しては、下の記事で詳しく解説しています
▼参考にした、Unityの公式リファレンスも載せておきますね。
Collisionの中身をだいたい把握したところで、次は具体的な使い方をみていきましょう♪
Collisionの使い方
ここで紹介するのは、【Collision】の使い方の一例です。
こんな感じで使うのかと、ざっくり認識してもらえたらと思います。
▼実際にコードを見て解説していきます。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class BollScript : MonoBehaviour { void Start() { } void Update() { } void OnCollisionEnter(Collision collision) { if(collision.gameObject.CompareTag("sample")) { Destroy(gameObject); } } }
上のコード13行目に、『OnCollisionEnter』という関数があります。
この関数は、ゲームオブジェクトに衝突が発生した時に呼ばれる関数になります。
注目して欲しいのは、引数の『Collision collision』のところですね。
ここで【Collision】がでてきます。
衝突した相手ゲームオブジェクトの、あらゆる情報がここに入っているというわけです。
上のコードでは、衝突相手のタグ名が『sample』だったら、スクリプトファイルを紐づけている方のゲームオブジェクトを消すという処理です。
この様に、関数の引数として【Collision】を使っていきます。
Collisionを引数にとる関数一覧
▼【Collision】を引数にとる関数を紹介します(3Dゲーム開発)
・OnCollisionStay → 衝突中ずっと実行される
・OnCollisionExit → 衝突後に実行
これらの関数は、【UnityEngine】オブジェクトの中の【MonoBehaviour】クラスの中で定義されている、イベント関数と言われるものです。
ゲーム中のあるタイミングになると自動で呼びだされる便利な関数です。
次は、【Collider】をみていきましょう(^^)
Colliderとは?
改めて【Collider】とは、ゲームオブジェクトの衝突範囲の情報が入っている箱(クラス)のことでした。
▼実際に下の画像で見てみましょう。
青色球体の周りの緑の線が、衝突範囲を表しています。
他のゲームオブジェクトに、この緑の線が当たると、青色球体は衝突判定を受けることになります。
この衝突範囲を制御するのが、【Collider】というわけですね。
【Collider】が設定されていなければ、ゲームオブジェクトは、衝突することすら出来なくなります。
衝突判定には、【Collider】の紐づけが必須!
そして、【Collider】の中の『Is Trigger』にチェックが入っていると衝突判定が出来ないので、チェックは外しておきましょう。
他にも、ゲームオブジェクトのどちらかに【Rigidbody】コンポネントが紐づけられていなければ、衝突判定は出来ません。
次に、【Collider】の種類をみていきましょう。
Colliderの種類
▼代表的な【Collider】を下に4つ挙げてみました。
・SpherCollider
・CapsuleCollider
・MeshCollider
ゲームオブジェクトの形状によって呼び名が変わります。
先ほどの、青色球体についていた【Collider】は、SpherColliderに当たります。
Colliderのプロパティ解説
ここでは、BoxColliderを例に見ていきます。
Is Trigger
『Is Trigger』は、ゲームオブジェクトの重なりを制御する項目です。
『Is Trigger』にチェックが入っていると、ゲームオブジェクト同士は衝突することなく重なる(通過する)ようになります。
重なり判定をしたいなら、この『Is Trigger』にチェックを入れましょう。
衝突判定をしたいなら、『Is Trigger』のチェックを外しましょう(^^)
Material
ここには、Projectウィンドウで作成した『Physics Material』を紐づけます。
Center
ゲームオブジェクトの位置を基準とした、【Collider】の位置を設定できます。
X:0 Y:0 Z:0 で、ゲームオブジェクトと全く同じ位置に配置されています。
Size
これはシンプルで、【Collider】の大きさを指定できます。
さいごに
【Collision】と【Collider】は、言葉は似ていますが全く違うものでした。
この記事で全てが網羅されているわけではないですが、最低限【Collision】と【Collider】をどんな風に使うのかが、イメージ出来るようになってもらえたら幸いです(^^)