シヴァのブログ

UnityやUE4や趣味とかいろいろ...

開発メモ 「衝突(接触)判定,Rigidbody,Collider」

「unity 敵と接触」で、

このブログを見てくれた人がいたので、簡単に説明します。

[方法]

まず、

①Planeの上空にCubeを設置。(この時再生を押してもCubeは浮いたまま)

f:id:shivaT:20130627040913p:plain

②Hierarchyで Cubeを選択
②Component > Physics > Rigidbody で、
 CubeのInspectorに Rigidbodyが追加される

f:id:shivaT:20130627041202p:plain

③Use Gravityにチェックを入れると自動的に落下するので、

 チェックを入れて再生で動作確認。(落下してPlane上で止まるとO.K.)

④ここからプログラムを書く。(Project上で、

 Create > Javascript でそのファイル(名前は何でもいい)に、以下のソースを記入)

***************************************************************************

function OnCollisionEnter(col : Collision){
    //衝突判定用の処理をする
    if(col.gameObject.name == "Plane"){
        Debug.Log("shoutotu!!!!");
    }
}

***************************************************************************

⑤そのファイルをCubeにD&D(ドラッグアンドドロップ)すると、

 Cubeにそのファイルが追加される。

f:id:shivaT:20130627043123p:plain

⑥再生を押して、Console上に「shoutotu!!!! UnityEngine.Debug:Log(Object)」

 という文字が書かれていると成功。(物体と衝突した瞬間に表示するので、

 何回か試して確認してください)

f:id:shivaT:20130627043812p:plain

 

では、

ここで、なぜこんなことが起こるのかを説明します。

初めに、

この衝突判定を行う上で、重要な点が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){}・・・衝突終わり

 

 

うん。

長くなりましたが、以上です。