世界で最も人気の高いゲームエンジンであるUnityを使用する上で、多くのユーザーがはじめに疑問を持つことになるのが当たり判定です。ゲーム作りの根幹を担う存在でもある当たり判定の概念は、早期にその仕組みを理解しておくことで、ゲーム作りをスムーズに進めていくことができるでしょう。
この記事では、そんな当たり判定の概要や、Unityを使って当たり判定を設定するための方法について、詳しく解説します。
Unityにおける当たり判定とは
Unityにおける当たり判定とは、ゲームを正しく制御するために欠かせない概念です。当たり判定とはその名の通り、物質そのものに「物体」としての概念を与え、物体同士が触れ合ったか否か、また触れ合った時にどのような挙動を出力するのかなどを設定するプロセスを指します。
初めてゲームを作る場合、忘れてはならないのが現実世界の常識はUnityを立ち上げた段階では一切反映されていないということです。重力や空気といった、現実世界で当たり前の存在は、ゲーム制作の3D空間においては開発者が設定しないと存在しません。
例えば球体をUnity上に生成しても、ぱっと見では球体が存在しているようには見えますが、その球体は触れることもできなければ、地上に向かって落ちていくようなこともありません。
こういった不可思議な状況を解消し、ゲームを成立させるために必要な要素の一つが、当たり判定です。
Unityで当たり判定が活躍するシーン
当たり判定を設定することで、Unityではどのようなことが可能になるのでしょうか。当たり判定を定義することで実装できる要素としては、
- ダメージ表現
- 壁の概念などを用いた空間表現
- 弾丸の発射表現
- その他重力表現など
などが挙げられます。当たり判定の最たる活用例は、やはりダメージ表現です。操作キャラが敵キャラクターに衝突したらダメージ、飛んでくる火の粉に当たったらダメージなどを設定する上では、当たり判定が重要な役割を果たします。
壁や鍵のかかっているドアにぶつかって、迂回したり鍵がないと先に進めないような仕様も、当たり判定がなければ成立しない要素です。当たり判定がないと、キャラクターやあらゆるオブジェクトは壁やドアをすり抜けてしまい、どこまでも直線的に進んでしまいます。
近年人気のFPSなどのシューター作品も、当たり判定が重要な役割を果たします。一つ一つの銃弾に当たり判定を与えるとともに、キャラクターの部位ごとに当たり判定とダメージを設定し、ダメージの程度を被弾箇所に応じて変更するようなことも可能にします。
また、地面の概念を3D空間に与えるなどの基本的な空間設定においても、当たり判定の設定があって初めて機能します。
Unityで当たり判定を設定する上で必要な要素
当たり判定をUnityを使ってゲームに実装する場合、知っておくべき要素が
- Collider
- Rigidbody
という2つです。
Colliderは、Unityにおいて当たり判定の処理を行ってくれるコンポーネントの一種で、3Dオブジェクトを生成すると、それぞれに初めから割り当てられている要素です。
2D・3Dを問わずオブジェクトにはColliderコンポーネントが存在し、これらの設定を柔軟に変更することで、当たり判定をゲームの仕様に沿って機能させることができます。詳しいColliderの設定方法については、後ほど解説します。
Rigidbodyとは、Unity内に存在する3Dオブジェクトに対して物理演算処理を与えるためのコンポーネントです。物質に重力の影響を与えたり、質量の概念を与えたりする上で欠かせない存在です。物が当たったかどうか判定は物質同士で行われる処理であるため、当たり判定を正しく機能させる上ではRigidbodyが役に立ちます。
Unityの当たり判定に欠かせないColliderの設定方法
それではここから、上で紹介したColliderとRigidbodyの設定方法について、順に解説します。まずはColliderの設定方法からです。
Colliderの種類
Colliderを設定するに当たっては、まず何らかの3DオブジェクトをUnity上に作成することで呼び出すことができます。Colliderは3Dオブジェクトの形状に応じて複数の種類があり、それが
- Box Collider
- Sphere Collider
- Cupsule Collider
- Mesh Collider
の4つです。Box Colliderは箱型の当たり判定を、Sphere Colliderは球体の当たり判定を、Cupsule Colliderはカプセル状の当たり判定を、Mesh Colliderは3Dモデルの形状そのままを当たり判定とすることができます。
また、2Dの場合もオブジェクトにColliderが設定でき、その種類は
- 2D Box Collider
- 2D Circle Collider
- Polygon Collider 2D
の3つです。基本的な仕様や設定方法は3Dのそれと同様で、一度使い方を理解できれば2D・3Dを問わず活用できるでしょう。今回は3DでのColliderの設定方法を解説します。
Colliderを機能させる方法
Colliderを機能させるには、まず当たり判定を設定したいオブジェクトをクリックして選択し、Inspectorウィンドウから「AddComponent」を選び「NewScript」をクリックします。そこで名前を適当に作成(今回はDamageScriptとします)し「Create and Add」をクリックしましょう。すると当たり判定処理を定義するためのスクリプトを作成できるので、以下の通りに記述しましょう。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class DamageScript : MonoBehaviour {// 当たりを判定した時に呼ばれる関数
void OnCollisionEnter(Collision collision)
{
Debug.Log(“Damage”);
}
}
以上のスクリプトを定義することで、その物体が別の物体に衝突した際、ログには「Damage」の表示が現れるようになります。これを発展させて、ダメージの判定があった際、オブジェクトにエフェクトを表示させたり、体力が減少したりといった効果を付与できるようになるでしょう。
当たり判定の設定におけるRigidbodyの役割と設定方法
上述した当たり判定を正しく機能させるには、オブジェクトが物体として正常に機能するよう設定しなければなりません。そこで役に立つのがRigidbodyで、当たったかどうかの判断基準を与えます。Colliderは「当たり」の判定基準と、当たった際の処理を定めるものであるのに対し、Rigidbodyは当たりそのものを定義する存在です。
Rigidbodyを設定するには、要素を付与したいオブジェクトをクリックして選択し、Inspectorウィンドウから「AddComponent」を選び「rigidbody」を選ぶことで可能です。
これにより、rigidbodyを付与した物体同士が接触した場合、お互いに通過することなく衝突してくれます。Colliderとは異なりRigidbodyはスクリプトを書く必要がないので、設定における面倒は回避しやすいかもしれません。
また、Rigidbodyはそれぞれのパラメーターを細かく設定することで、物体ごとの挙動を高度に制御することができます。設定パラメータについては、以下の表にまとめました。
Mass | 物体の有する質量(単位はキログラム) |
Drag | 何らかの力が働いた際に発生する空気抵抗の大きさ |
AngularDrag | 回転運動が発生した際の空気抵抗の大きさ |
UseGravity | オブジェクトに重力の影響を与えるか否か(チェックを入れると重力の影響を受ける) |
IsKinematic | エンジン固有の物理特性ではなく、Transform設定によって制御するか否か |
Interpolate | 物理演算の影響の度合い |
CollisionDetection | 衝突の検知の設定。壁抜けを防止できる |
Constraints | Rigitbodyの影響の有無を、X,Y,Z軸ごとに設定 |
Mass設定やUseGravity設定は中でも取り扱う頻度が高いため、積極的に活用する癖をつけておくと良いでしょう。
Unityで当たり判定を設定する際に意識したいポイント
Unityにおける基本的な当たり判定の処理については、上で紹介したCollisionとRigidBodyを設定することで、都合をつけることが可能です。上記に合わせて以下の2津への理解も深め、より高度な当たり判定を設定してみましょう。
見た目通りの当たり判定が正しいとは限らない
人型や動物のような、複雑な3Dオブジェクトに当たり判定を与える場合、Mesh Colliderを使って見たままの当たり判定を設定するのはわかりやすい方法ではありますが、必ずしもゲーム作りにおいては正しい設定であるとは限りません。見た目通りに当たり判定を設定してしまうと、判定がシビアすぎてゲームとしての楽しさが失われてしまう可能性があるためです。
当たり判定を設定する場合、試行錯誤を繰り返してゲーム性と納得のいく判定の具合をうまく調整しながら設定しましょう。
PhysicMaterialを活用する
PhysicMaterialは、オブジェクトに対して設定が可能なコンポーネントの一種で、摩擦や反発などを物体にもたらせる概念です。同コンポーネントの設定により、当たり判定と併用することで物体に対してより細かな挙動を与えることができます。Rigidbodyなどと合わせて、使いこなせるようになると良いでしょう。
Unityの当たり判定についてのまとめ
この記事では、Unityを使った当たり判定の設定方法について解説しました。当たり判定はゲーム作りにおける基本的な処理であるため、必ず使いこなせるようになる必要があります。
当たり判定の設定方法、加えて物質の処理の仕組みやパラメーターの設定方法などを学び、質の高いゲームづくりを目指しましょう。