Unityでプレイヤーとオブジェクトの当たり判定を設定する方法

unity

はじめに

UnityでプレイヤーをWASDキーなどで移動できるようにしたら、次に必要になるのがオブジェクトとの当たり判定です。

前回は、[WASDキーでプレイヤーを移動する方法]の記事で、キーボードを使ったプレイヤーの移動を設定しました。

UnityでWASDキーを使って移動させる方法|Input Systemで操作を実装
UnityのInput Systemを使って、WASDキーでプレイヤーを前後左右に移動させる方法を解説します。Input ActionsやPlayer Inputの設定からスクリプトまで紹介します。

また、[UnityでFPS視点のカメラを設定する方法]では、マウス操作でプレイヤーの視点を動かせるようにしました。

Unityで一人称視点のカメラを作る方法|Input Systemでマウス操作
UnityのInput Systemを使って、一人称視点のカメラを作る方法を解説します。マウス操作による左右・上下の視点移動や、カメラの回転制限を実装します。

例えば、プレイヤーが壁に向かって移動したときに、壁をすり抜けてしまってはゲームとして不自然です。

Unityでは、ColliderRigidbodyを使用することで、プレイヤーと壁などのオブジェクトが衝突するように設定できます。

今回は、プレイヤーと壁を用意して、プレイヤーが壁をすり抜けずに止まるようにする方法を紹介します。


Colliderとは

Colliderは、ゲームオブジェクトの当たり判定を設定するためのコンポーネントです。

見た目の形そのものではなく、ゲーム内で「ここにオブジェクトがある」と判定する範囲を設定します。

Colliderにはいくつかの種類がありますが、今回は以下の4種類を紹介します。

  • Box Collider:四角形のオブジェクトなどに使用
  • Sphere Collider:球形のオブジェクトなどに使用
  • Capsule Collider:プレイヤーなどに使用
  • Mesh Collider:複雑な形状のオブジェクトなどに使用

今回は、プレイヤーにはCapsule Collider、壁にはBox Colliderを使用します。


プレイヤーにColliderを追加する

前回の記事で作成したプレイヤーを使用します。

まず、プレイヤーを右クリックし、3D Object → Capsuleからカプセルを作成します。

作成したCapsuleをプレイヤーの子オブジェクトとして配置します。

今回は、このCapsule当たり判定用のオブジェクトとして使用します。

Capsuleを選択し、InspectorのTransformからPositionScaleを調整して、プレイヤーの位置や大きさに合わせます。

また、ゲーム画面にカプセルを表示する必要はないため、Mesh Rendererのチェックを外して非表示にします。

Capsuleには最初からCapsule Colliderが設定されています。InspectorでCapsule Colliderが設定されていることを確認してください。

もし設定されていない場合は、Add Component → Capsule Colliderから追加します。

当たり判定の位置や大きさは、Capsule ColliderCenterHeightRadiusから調整することもできます。

今回はTransformを使ってカプセル自体の位置や大きさを調整していますが、Colliderの形状を個別に調整したい場合は、Capsule Collider側の設定を使用します。


壁にColliderを設定する

次に、プレイヤーがぶつかる壁を用意します。

今回は分かりやすいように、Cubeを配置して壁として使用します。

Cubeには最初からBox Colliderが設定されているため、基本的には追加する必要はありません。

HierarchyでCubeを選択し、Inspectorを確認するとBox Colliderが表示されています。

これで壁側の当たり判定は設定されています。


プレイヤーにRigidbodyを追加する

次に、プレイヤーにRigidbodyを追加します。

プレイヤーを選択して、InspectorのAdd ComponentからRigidbodyを追加します。

Rigidbodyは、ゲームオブジェクトをUnityの物理演算の対象にするためのコンポーネントです。

今回の設定では、基本的に以下の状態にします。

  • Use Gravity:ON
  • Is Kinematic:OFF

Use GravityをONにすると、プレイヤーに重力が働くようになります。

Is KinematicをOFFにしておくことで、Rigidbodyによる物理演算の影響を受けるようになります。


実際にプレイヤーと壁を衝突させる

ここまで設定できたら、ゲームを実行します。

プレイヤーと壁の両方にColliderが設定されており、プレイヤーにRigidbodyが設定されていれば、プレイヤーが壁に衝突するようになります。

プレイヤー → → → |壁|
                  ↑
              ここで衝突

実際にプレイヤーを壁に向かって移動させると、壁をすり抜けずに衝突することが確認できます。

ただし、この状態では壁にぶつかった際に、プレイヤーが倒れてしまうことがあります。


プレイヤーが倒れないようにする

プレイヤーが倒れないようにするには、RigidbodyConstraints → Freeze Rotationを設定します。

  • X:ON
  • Y:OFF
  • Z:ON

これで、プレイヤーが前後や左右に倒れるのを防ぎながら、Y軸方向には回転できるようになります。

設定後、もう一度ゲームを実行して動作を確認します。

壁に衝突した際にプレイヤーが倒れず、立った状態を維持できていれば設定完了です。

また、2つの壁を用意し、それぞれのBox ColliderをONとOFFにして比較します。

Box Colliderが設定された壁には衝突し、設定されていない壁はすり抜けることを確認できます。


まとめ

今回は、Unityでプレイヤーと壁などのオブジェクトに当たり判定を設定する方法を紹介しました。

基本的な構成は、

  • プレイヤーにColliderを設定する
  • プレイヤーにRigidbodyを設定する
  • 壁などのオブジェクトにColliderを設定する
  • RigidbodyFreeze Rotationでプレイヤーが倒れないようにする

という形です。

ColliderRigidbodyは、プレイヤーとオブジェクトを衝突させるための基本的な機能なので、ゲーム制作でもよく使用します。

今回の設定を使えば、壁だけでなく、さまざまなオブジェクトとの衝突にも応用できます。