開発メモ 「衝突(接触)判定,Rigidbody,Collider」
「unity 敵と接触」で、
このブログを見てくれた人がいたので、簡単に説明します。
[方法]
まず、
①Planeの上空にCubeを設置。(この時再生を押してもCubeは浮いたまま)
②Hierarchyで Cubeを選択
②Component > Physics > Rigidbody で、
CubeのInspectorに Rigidbodyが追加される
③Use Gravityにチェックを入れると自動的に落下するので、
チェックを入れて再生で動作確認。(落下してPlane上で止まるとO.K.)
④ここからプログラムを書く。(Project上で、
Create > Javascript でそのファイル(名前は何でもいい)に、以下のソースを記入)
***************************************************************************
function OnCollisionEnter(col : Collision){
//衝突判定用の処理をする
if(col.gameObject.name == "Plane"){
Debug.Log("shoutotu!!!!");
}
}
***************************************************************************
⑤そのファイルをCubeにD&D(ドラッグアンドドロップ)すると、
Cubeにそのファイルが追加される。
⑥再生を押して、Console上に「shoutotu!!!! UnityEngine.Debug:Log(Object)」
という文字が書かれていると成功。(物体と衝突した瞬間に表示するので、
何回か試して確認してください)
では、
ここで、なぜこんなことが起こるのかを説明します。
初めに、
この衝突判定を行う上で、重要な点が2点あります。
それは、「Rigidbody」と、「Collider」です。
「Collider(コライダ)」って何?...と思われたかもしれません。しかし、
上の作業ができている人ならば、必ず使用しているモノです。
例で言うと、
CubeのInspectorを見て下さい。
そこに、「Box Collider」というものが、すでに入っていると思います。
それが、「Collider」です。
Colliderの種類は、その他にも「sphere Collider」などがあります。
では、
次になぜその2点が重要なのかを説明します。
- なぜ、「Rigidbody」が必要なのか?
Rigidbody によって、GameObjectが物理特性の制御下で動作するようになる。
- なぜ、「Collider」が必要なのか?
Collider は Rigidbody の物理特性の境界を定義する。
はい。
つまり、Rigidbodyで、物理的影響の下で動くようになり、
Colliderで、衝突したかどうかを確認する...みたいな感じです。
だから、
衝突する双方のオブジェクトにcolliderをアタッチしないと判定しなくて、
これがないと、衝突判定は起こせません。
また、
・各Colliderの項目にある「isTrigger」にチェックを入れると、
他のオブジェクトとの衝突が無くなりますが、当たり判定だけが
取れるオブジェクトになるので覚えていて損はないです。
・isKinematicでTrueをチェックすることで、
オブジェクトに物理エンジンが作用しない。
・Character Controller を追加した場合は、
衝突される方のオブジェクトは Is Trigger にチェックする。
あとは、ソースコード内で、衝突判定用の処理をすれば完成です。
function OnCollisionEnter(col : Collision){
if(col.gameObject.name == "〇〇"){}//オブジェクト名
if(col.gameObject.tag == "〇〇"){}//タグ名
}
〇〇のなかに、
オブジェクトの名前を入れたり、tagの名前を入れたりすることで、
色々な反応を与えることができます。
<補足>
・OnTriggerEnter(other : Collider){}・・・衝突始まり
・OnTriggerStay(other : Collider){}・・・衝突中
・OnTriggerExit(other : Collider){}・・・衝突終わり
・OnCollisionEnter(other : Collision){}・・・衝突始まり
・OnCollisionStay(other : Collision){}・・・衝突中
・OnCollisionExit(other : Collision){}・・・衝突終わり
うん。
長くなりましたが、以上です。