衝突判定!Unityで当たり判定をつける方法 【初心者向け】
初心者向けにUnityで当たり判定(衝突判定)をつける方法を紹介。Unityでゲームを作る上で何かが衝突して動作を起こすことがよくあります。実際のゲーム開発でも役立つ知識なので、ぜひ理解しておきましょう。
テックアカデミーマガジンは受講者数No.1のプログラミングスクール「テックアカデミー」が運営。初心者向けにプロが解説した記事を公開中。現役エンジニアの方はこちらをご覧ください。 ※ アンケートモニター提供元:GMOリサーチ株式会社 調査期間:2021年8月12日~8月16日 調査対象:2020年8月以降にプログラミングスクールを受講した18~80歳の男女1,000名 調査手法:インターネット調査
当たり判定はゲームの基本である機能と言えます。
シューティングゲームで敵と弾丸が当たった時の判定や、アクションでの敵との衝突判定など様々なゲームで作ることができます。そこで今回は、Unityで実際に当たり判定をつける方法を解説していきたいと思います。
今回は跳ねる玉を地面と衝突させて、衝突した際にお互いの色が変わるというサンプルで実装していきたいと思います。
設定を3Dにして新規プロジェクトを作成して進めていきましょう。
なお、本記事はTechAcademyのUnity入門オンライン講座の内容をもとにしています。
今回は当たり判定について勉強してみよう。
田島メンター!!当たり判定というのは、具体的にどんな機能なんですか〜?
オブジェクト同士が衝突したときに特定の動作を行うよう指定するんだ。まずはふたつのオブジェクトを作成して、それがぶつかるように設定してみよう。
分かりました!
1. オブジェクトを作成する
以下のようにSphereとCubeを作成して配置します。
この状態でプレイボタンを押しても、オブジェクトは動きません。
2. 上のSphereにRigidbodyを追加
上の CubeにRigidbodyコンポーネントを追加します。
Inspectorタブの「AddComponent」ボタンを押し、[physics]->[Rigidbody]を選択します。
Rigidbodyを追加したオブジェクトは、重力や他のオブジェクトの影響を受けるようになります。
試しにプレイボタンを押すと、Sphereが落下してCubeの上で止まるのが確認できます。
せっかくなので衝突時の挙動をもう少しリアルにしてみましょう。
[Assets]->[Create]->[Physic Material]から、Physic Materialを作成します。
作成したPhysic Materialを、シーン上のSphereとCubeにそれぞれドラッグ&ドロップします。
Physic MaterialのBounciness(弾性)を、Inspectorで0.8に設定します。
この状態で再生ボタンを押すと、弾性が適用され、Sphereが跳ねるように落下するのが確認できます。
3. ぶつかった時の処理を追加
次に、ぶつかったときに特定の処理を実行してみます。
[Assets]->[Create]->[C# Script]からC#スクリプトを作成します。
ファイルの名前は、今回は「ChangeColorOnHit.cs」としてみましょう。
スクリプトをダブルクリックして開き、以下の内容を貼り付けます。
using UnityEngine; public class ChangeColorOnHit : MonoBehaviour { void OnCollisionEnter(Collision collision) { var r = Random.Range(0f, 1f); var g = Random.Range(0f, 1f); var b = Random.Range(0f, 1f); GetComponent<Renderer>().material.color = new Color(r, g, b); } }
先程のPhysic Materialと同様に、ChangeColorOnHitスクリプトをSphereとCubeにドラッグ&ドロップします。
再生ボタンを押すと、衝突するたびに色がランダムで変わるのが確認できます。
Unityでは、”OnCollisionEnter”という名前のメソッドを記述すると、他のオブジェクトと衝突した際に自動的に呼び出されます。
今回は自身の色をランダムに変える処理を記述したことで、衝突時に色がランダムに変わるようになっています。
地面と球体、両方の色が変わっているのは、両方にスクリプトを貼り付けたからだよ。
貼り付けたスクリプトを外せば、色は変わらなくなるんですね。
その通り。球体だけの色を変えたり、地面だけの色を変えたりいろいろと試してみよう。
なるほど、ぶつかったときの処理をスクリプトに書いて、
処理をさせたいオブジェクトに貼り付けるのが当たり判定の実装なんですね。
番外編
“OnCollisionEnter”メソッドの引数には、衝突した相手側のオブジェクト情報が渡されます。
なので、衝突した相手の名前やタグによって処理を分岐することもできます。
void OnCollisionEnter(Collision collision){ if(collision.gameobject.name == “enemy”){ Destroy(gameobject); } else{ //それ以外の処理 } }
いかがでしょうか。
今回は3Dで解説を行いましたが、Collider,Rigidbody,OnCollisionEnterをそれぞれ2Dに変更するだけで、2Dにも対応することができます。
是非ご自身のゲーム制作にも役立てていってください。
当たり判定の処理にはRigidbodyが必須なので、こちらもセットで覚えておこう。
Rigidbodyを付けたオブジェクトは、重力や他のオブジェクトの影響を受けるんでしたね。
その通り! コードによっては特定の相手に当たったときだけ処理を行ったりと色々設定することができるよ。
if文を使った場合のケースも練習してみます。ありがとうございました!
[お知らせ]TechAcademyではオリジナルゲームアプリが公開できるUnityオンラインブートキャンプを開催しています。現役Unityエンジニアのサポートで効率的に学びたい場合はご検討ください。