Unity 6で地面と当たり判定を作る方法|ColliderとRigidbodyを初心者向けに解説

Unity 6で地面と当たり判定を作る初心者向け記事のアイキャッチ画像 Unity

前回は、ChatGPTなどのAIに相談しながらC#スクリプトを作成し、W・A・S・DキーでPlayerを移動できるようにしました。

今回は、Playerが移動するための地面を作成します。

さらに、Unityのゲーム制作で重要になる「Collider」と「Rigidbody」についても確認していきます。

現在のPlayerはゲーム画面上を移動できますが、まだ物理演算を利用した状態にはなっていません。

そこで今回は、地面に当たり判定を設定し、PlayerにRigidbodyを追加して、Playerが地面の上に存在できる基本的な状態を作ります。

ColliderやRigidbodyは、今後敵・壁・アイテム・障害物などを実装するときにも何度も使用する機能です。

前回のPlayer移動についてはこちらの記事で解説しています。

Unity 6でAIを使ってプレイヤーを動かす方法|ChatGPTでC#スクリプトを作成

地面となるPlaneを作成する

まずは、Playerが移動するための地面を作成します。

Unityにはさまざまな3D Objectが用意されています。

今回は平らな地面を簡単に作れる「Plane」を使用します。

Hierarchyから新しいPlaneを作成すると、Sceneビューに平らなオブジェクトが表示されます。

作成直後の名前は「Plane」になっていますが、今後分かりやすく管理するため、

Ground

に変更します。

HierarchyにPlayerとGroundが表示されていればOKです。

Groundの位置と大きさを設定する

次にGroundのTransformを調整します。

Playerは前回、

Position Y = 1

付近に配置しています。

そのため、Groundはその下に配置します。

今回はGroundのPositionを、

X = 0

Y = 0

Z = 0

にします。

さらに、Playerが動ける範囲を広くするためにScaleも変更します。

例えば、

X = 3

Y = 1

Z = 3

のようにすると、最初のテスト用として十分な広さになります。

PlaneのScaleを変更すると、Sceneビュー上でも地面が広がっていることを確認できます。

Unity 6でPlaneをGroundとして配置しPositionとScaleを設定した画面
Planeの名前をGroundに変更し、PositionとScaleを設定します。

今後ゲームのマップを作るときは、地面をさらに広くしたり、複数のオブジェクトを組み合わせたりしてゲーム世界を作っていきます。

Colliderとは?

UnityでGameObject同士がぶつかったことを判定するために使用するのが「Collider」です。

見た目として3Dモデルが存在していても、Colliderがなければ他のGameObjectとの当たり判定が行われない場合があります。

例えば、

  • Playerと地面
  • Playerと壁
  • Playerと敵
  • Playerとアイテム

などの接触を判定するときにColliderを使用します。

Colliderにはいくつか種類があります。

代表的なものとして、

Collider主な用途
Box Collider箱型の当たり判定
Sphere Collider球型の当たり判定
Capsule Colliderカプセル型の当たり判定
Mesh Collider3Dモデルの形状に近い当たり判定

などがあります。

形状が単純な場合は、Box ColliderやCapsule ColliderなどのシンプルなColliderを使用する方が処理も分かりやすくなります。

GroundのColliderを確認する

今回作成したPlaneには、最初からColliderが設定されています。

HierarchyでGroundを選択し、Inspectorを確認します。

Planeには通常、

Mesh Collider

が付いています。

UnityのGroundにMesh Colliderが設定されている画面
Planeには最初からMesh Colliderが設定されているため、Groundの当たり判定として使用できます。

これが地面の当たり判定になります。

そのため今回は、Groundに新しくColliderを追加する必要はありません。

Colliderが設定されていることで、物理演算を利用するPlayerが地面をすり抜けずに止まれるようになります。

PlayerのColliderを確認する

次にPlayerを確認します。

今回PlayerにはCubeを使用しているため、Cubeを作成した時点で

Box Collider

が設定されています。

UnityのPlayerにBox Colliderが設定されている画面
CubeをPlayerとして使用しているため、Playerには最初からBox Colliderが設定されています。

HierarchyからPlayerを選択してInspectorを見ると、Box Colliderを確認できます。

Box Colliderは、Playerの周囲に箱型の当たり判定を作ります。

現在はPlayer自体も箱型なので、Box Colliderとの相性がよく、今回のテストには十分です。

将来的に人型のキャラクターモデルを使用する場合は、Capsule Colliderなど別のColliderを使うこともあります。

Rigidbodyとは?

Colliderだけでは、GameObjectが自動的に重力で落下するわけではありません。

Unityの物理演算によってGameObjectを動かすために使用するComponentが「Rigidbody」です。

Rigidbodyを追加すると、

  • 重力
  • 衝突
  • 力を加えた移動
  • 物理的な回転

などを利用できるようになります。

例えばPlayerにRigidbodyを追加し、Gravityを有効にすると、Playerは重力によって下方向へ落下します。

しかしGroundにはColliderがあるため、PlayerとGroundのColliderが衝突し、Playerは地面の上で止まります。

PlayerにRigidbodyを追加する

HierarchyでPlayerを選択し、InspectorからRigidbodyを追加します。

Rigidbodyを追加すると、Inspectorに新しい設定項目が表示されます。

UnityでPlayerにRigidbodyを追加した画面
PlayerにRigidbodyを追加し、Use Gravityが有効になっていることを確認します。

今回特に確認するのは、

Use Gravity

です。

Use Gravityが有効になっていると、Playモード開始後にPlayerへ重力が適用されます。

今回は重力による落下を分かりやすく確認するため、テスト時のみPlayerのPosition Yを3に変更します。

Playerを地面より少し高い位置に配置してPlayすると、

Playerが下に落ちる

Groundにぶつかる

地面の上で止まる

という動作を確認できます。

これがUnityの基本的な物理演算の一例です。

Playerが倒れないようにRotationを固定する

Rigidbodyを追加すると、Playerは物理演算によって回転するようになります。

そのため、壁などにぶつかったときにPlayerが倒れてしまう場合があります。

今回のPlayerは縦長のCubeなので、ゲーム操作中に倒れないように回転を固定します。

RigidbodyのConstraintsから、

  • Freeze Rotation X
  • Freeze Rotation Z

を有効にします。

UnityのRigidbodyでPlayerのRotation XとZを固定した画面
Playerが物理演算で倒れないように、Freeze RotationのXとZを有効にします。

これで前後・左右に倒れにくくなります。

Y方向の回転については、今後Playerの向きを変更する可能性があるため、今回は固定しません。

ゲームの仕様によって必要なConstraintsは変わりますが、今回は初心者向けのシンプルなPlayer操作としてこの設定を使用します。

現在のPlayerMovementについて注意

前回作成したPlayerMovementでは、

transform.Translate()

を使ってPlayerを移動しています。

これはシンプルで初心者にも理解しやすい方法ですが、Rigidbodyを使った本格的な物理移動では、Transformを直接変更する方法よりもRigidbodyを使って移動させる方法が適しています。

そのため、このシリーズでは今後必要に応じてPlayerMovementも改善していきます。

今回はまず、

Colliderで当たり判定を作る

Rigidbodyで重力を有効にする

という基本的な仕組みを確認します。

AIを使う場合も、最初から完璧なコードを作るのではなく、ゲームの機能が増えるたびにコードを修正していくことがあります。

Playモードで地面との当たり判定を確認する

設定ができたら、Unity上部のPlayボタンを押します。

PlayerにRigidbodyのGravityが設定されているため、Playerは下方向へ落下します。

GroundのColliderに当たると、その位置で止まります。

PlayerがGroundをすり抜けず、地面の上で停止すれば成功です。

UnityでRigidbodyの重力によってPlayerがGroundの上に停止した画面
PlayモードでPlayerに重力がかかり、GroundのColliderに当たって地面の上で停止します。

その状態でW・A・S・Dキーを押し、Playerが地面の上を移動できるかも確認します。

UnityでPlayerがGroundの上をWASDキーで移動している画面
WASDキーを使って、PlayerがGroundの上を移動できることを確認します。

もしPlayerが倒れてしまう場合は、RigidbodyのFreeze Rotation XとZが設定されているか確認してください。

また、Playerが地面をすり抜ける場合は、PlayerとGroundのColliderが正しく設定されているか確認します。

動作確認が終わったらPlayモードを停止し、PlayerのPosition Yを1に戻しておきます。

ColliderとRigidbodyの違い

ここまで使ったColliderとRigidbodyは名前も役割も異なるため、整理しておきます。

Component主な役割
ColliderGameObjectの当たり判定を作る
RigidbodyGameObjectに物理演算を適用する

簡単に考えると、

Collider = ぶつかるための形

Rigidbody = 物理的に動くための機能

です。

例えばGroundは動かす必要がないためColliderだけで十分です。

一方、Playerは重力や物理演算を利用したいため、ColliderとRigidbodyの両方を使用します。

この違いを覚えておくと、今後壁や敵などを作成するときにも理解しやすくなります。

今回のまとめ

今回はUnity 6でPlayerが移動するためのGroundを作成し、ColliderとRigidbodyの基本について確認しました。

GroundにはColliderが設定されており、PlayerにはBox ColliderとRigidbodyを使用します。

RigidbodyのUse GravityによってPlayerに重力が適用され、GroundのColliderとの衝突によってPlayerが地面の上で止まります。

また、Playerが物理演算によって倒れないようにFreeze Rotationも設定しました。

ColliderとRigidbodyはUnityのゲーム制作で頻繁に使用するため、今回のようなシンプルなSceneで実際の動きを確認しておくと理解しやすくなります。

次回は壁とゲームエリアを作る

Playerが地面の上を移動できるようになったので、次はゲームエリアを少しずつ作っていきます。

次回はCubeを使って壁を配置し、Playerがゲームエリアの外へ出ないようにします。

Playerが壁にぶつかって止まることで、Colliderの仕組みもさらに分かりやすく確認できます。

さらに、複数のGameObjectを整理しながら簡単な3Dゲーム空間を作っていきます。

タイトルとURLをコピーしました