衝突判定!Unityで当たり判定をつける方法 【初心者向け】

初心者向けにUnityで当たり判定(衝突判定)をつける方法を紹介。Unityでゲームを作る上で何かが衝突して動作を起こすことがよくあります。実際のゲーム開発でも役立つ知識なので、ぜひ理解しておきましょう。

TechAcademyマガジンはオンラインのプログラミングスクールTechAcademy [テックアカデミー]が運営する教育×テクノロジーのWebメディアです。初心者でもすぐ勉強できる記事が1,000以上あります。

当たり判定はゲームの基本である機能と言えます。

シューティングゲームで敵と弾丸が当たった判定や、アクションでの敵との衝突判定など様々なゲームで作ることができます。そこで今回はUnityで実際に当たり判定をつける方法を解説していきたいと思います。

今回は二つのオブジェクトを衝突させて、ぶつかった際に両方のオブジェクトを削除するという方法で当たり判定の実装をしていきたいと思います。3Dで新しいプロジェクトを作成して進めていきましょう。

 

なお、本記事はTechAcademyのUnity入門オンライン講座の内容をもとにしています。

 

20163020-2

 

今回は当たり判定について勉強してみよう。

 

20160620

 

田島メンター!!当たり判定というのは、具体的にどんな機能なんですか〜?

 

20163020-2

 

オブジェクト同士が衝突したときに特定の動作を行うよう指定するんだ。まずはふたつのオブジェクトを作成して、それがぶつかるように設定してみよう。

 

20160620

 

分かりました!

 

1. オブジェクトを作成する

画像のように二つのCubeを作成してください。上のCubeは位置を(0,4,0)、下のCubeは(0,0,0)に設定しましょう。

unity_04_01

 

2. 上のCubeにRigidbodyを追加

上の CubeにRigidbodyを追加してください。

unity_04_02

当たり判定を行うためにはぶつかる二つのオブジェクトの内少なくとも片方にRigidbodyがコンポーネントされている必要があります。

追加後再生ボタンを押すと、上のCubeが下のCubeに向かって落ちていくことがわかります。ただ今は処理を行っていないので物理法則に従って落ちていきぶつかっただけです。

 

[PR] Unityを使ったゲーム開発で挫折しない学習方法を動画で公開中

3. ぶつかった時の処理を追加

それでは、ぶつかったときの処理を書いていきましょう。CollisionSampleと言う名前で新規ファイルを作成して、以下のコードを入力してください。

void OnCollisionEnter(Collision collision){
  Destroy(collision.gameObject);
  Destroy(this.gameObject);
}

「void OnCollisionEnter(Collision collision){}」の中に書かれたコードが、他のオブジェクトにぶつかった時に呼ばれます。 Destroy(Gameobject)でGameobjectを削除するという処理になります。今回は両方のオブジェクトを削除するので、各オブジェクトを削除するようにコードを呼びます。

再生して両方のオブジェクトが削除されれば成功です。

 

20163020-2

 

作成したスクリプトを上のCubeに追加しよう。再生するとどうなるかな?

 

20160620

 

あ!ぶつかった瞬間両方のCubeが消えました!

 

20163020-2

 

例えばDestroy(this.gameObject);の部分を削除すると、衝突された下側のCubeだけが消えて上のCubeがさらに下に落下するよ。一度試してみよう。

 

20160620

 

なるほど、逆に上のCubeだけをぶつかったときに消すみたいなこともできるんですね。

 

番外編

「void OnCollisionEnter(Collision collision){}」のcollisionにはぶつかった相手側のオブジェクトの情報が入ります。

そのため以下のようなコードを書けばぶつかった相手によって処理を分けるなんてこともできます。

void OnCollisionEnter(Collision collision){
  if(collision.gameobject.name == “enemy”){
    Destroy(gameobject);
  }
  else{
    //それ以外の処理
  }
}

 

いかがでしょうか。

今回は3Dで解説をしましたが、Collider,Rigidbody,OnCollisionEnterをそれぞれ2Dに変更するだけで、2Dにも対応することができます。是非ご自身のゲーム制作にも役立てていってください。

 

20163020-2

 

当たり判定の処理にはRigidbodyが必須なので、こちらもセットで覚えておこう。

 

20160620

 

最低でも衝突するどちらかのひとつに必要なんでしたね。

 

20163020-2

 

その通り!コードによっては特定の相手に当たったときだけ処理を行ったりと色々設定することができるよ。

 

20160620

 

if文を使った場合のケースも練習してみます。ありがとうございました!

 

[お知らせ]TechAcademyではオリジナルゲームアプリが公開できるUnityオンラインブートキャンプを開催しています。現役Unityエンジニアのサポートで効率的に学びたい場合はご検討ください。