Roba Memo - 素人のUnity覚書と奮闘記

素人のUnity覚書と奮闘記

Unity2D 当たり判定の取り方

※2017/08/02 加筆修正

例えば、キャラクターと障害物の当たり判定を取りたい場合。

障害物の設定

Box Collider 2Dを付ける

ボックスコライダーというのは、衝突判定を取る範囲の設定をするコンポーネントのこと。

(1)障害物を配置したら、インスペクターで
    Add Component - Physics 2D - Box Collider 2Dを選ぶ。
(2)コライダーのサイズを設定する。

サイズの調整方法

Sizeの項目で、適当に数値を入れておいて、Editボタンを押したら、緑色の線が出るので、四角いハンドル部分をドラッグして調整する。
f:id:nico-taniku:20170801080321p:plain:h200 f:id:nico-taniku:20170801080340p:plain:h200

キャラクターの設定

Box Collider 2Dを付ける

障害物と同様に設定する。

Rigidbody 2Dを付ける

リジッドボディは、重力や抵抗力といった物理演算をするコンポーネントのこと。
設定項目の詳細は、公式にて。

docs.unity3d.com

この状態で再生すると、重力の影響を受けてキャラクターが下方向へ落ちて行くはず。
目的に応じて設定するのだけど、設定の方法で使うメソッドが変わってくる。

物理演算が必要な場合

キャラクターの設定項目

・RigidbodyのBodyType : Dynamic
・Box ColliderのIs Triggerのチェックを外す

スクリプト

スクリプトは、Unity側で用意されたイベントトリガーがあるので、それを使う。

//衝突した時に、一度だけ実行する
void OnCollisionEnter2D(Collision2D coll) {

}

//衝突している間、毎フレーム実行される
void OnCollisionStay2D(Collision2D coll) {

}

//離れた時に、一度だけ実行する
void OnCollisionExit2D(Collision2D coll) {

}

引数について

Collision2D coll が引数で設定されている。collは変数名なので任意の名前でOK。
これは、衝突した相手のCollision2Dを取得している。
なので、衝突した相手のタグ名を取得したい場合は、こう書く。

string tag = coll.gameobject.tag;

物理演算が必要ない場合

キャラクターの設定項目

・RigidbodyのBodyType : Kinematic
・Box ColliderのIs Triggerにチェックを入れる
 (障害物の方には、チェックを入れなくて良い)

スクリプト

同様にスクリプトは、Unity側で用意されたイベントトリガーがあるので、それを使う。

//衝突した時に、一度だけ実行する
void OnTriggerEnter2D(Collider2D other) {

}

//衝突している間、毎フレーム実行される
void OnTriggerStay2D(Collider2D other) {

}

//離れた時に、一度だけ実行する
void OnTriggerExit2D(Collider2D other)

}

引数について

同様に、otherは変数名なので任意の名前でOK。

以上。