前回は、Unity 6でGroundの周囲に4つの壁を作成し、Playerがゲームエリアの外へ出ないようにしました。
さらに、PlayerMovementをRigidbodyを使った移動方法へ変更し、Playerが壁にぶつかって停止することも確認しました。
今回は、そのゲームエリアの中に障害物を配置していきます。
障害物にはUnityのCubeを使用し、Playerが障害物を通り抜けず、避けながら移動できる状態を作ります。
また、Ground・壁・障害物にMaterialを設定し、これまでほぼ同じ色だったゲームエリアの見た目も少し分かりやすくしていきます。
前回の壁とゲームエリアの作り方についてはこちらの記事で解説しています。
Unity 6で壁とゲームエリアを作る方法|CubeとColliderで移動範囲を作成
今回作るもの
現在のゲームエリアには、
Player
Ground
Walls
があります。
今回はさらに、ゲームエリアの中に複数の障害物を配置します。
障害物にはCubeを使用し、
Obstacle_01
Obstacle_02
Obstacle_03
という名前で管理します。
PlayerをW・A・S・Dキーで操作し、障害物にぶつかると停止することを確認します。
さらにMaterialを使って、Ground・壁・障害物の色を変更します。
ゲームの内容自体はまだシンプルですが、見た目にも少しずつ「ゲームのステージ」らしくしていきます。
障害物を管理するためのObstaclesを作成する
前回は4つの壁をWallsという親GameObjectの中にまとめました。
今回も同じように、障害物を整理するための空のGameObjectを作成します。
名前は、
Obstacles
にします。
これから作成する障害物は、すべてObstaclesの子GameObjectとして配置します。
Hierarchyは最終的に、
Obstacles
├─ Obstacle_01
├─ Obstacle_02
└─ Obstacle_03
のような状態を目指します。
GameObjectが増えてきた段階から整理する習慣を付けておくと、後からSceneの内容を確認しやすくなります。
最初の障害物をCubeで作成する
まずは1つ目の障害物を作ります。
Hierarchyから3D ObjectのCubeを作成します。
作成したCubeの名前を、
Obstacle_01
に変更します。
今回はゲームエリア中央から少し右側に配置してみます。
例えばTransformを、
Position X = 4
Position Y = 1
Position Z = 2
Scale X = 2
Scale Y = 2
Scale Z = 2
に設定します。
これで、Playerより少し大きな箱型の障害物がゲームエリア内に配置されます。

障害物にもBox Colliderが付いている
Obstacle_01はCubeから作成しているため、最初から
Box Collider
が設定されています。

そのため、今回も新しくColliderを追加する必要はありません。
PlayerにはBox ColliderとRigidbodyがあり、Obstacle_01にもBox Colliderがあります。
この状態でPlayerをObstacle_01へ移動させると、Collider同士が接触してPlayerが障害物を通り抜けないようになります。
前回作成した壁と同じ仕組みを、今度はゲームエリア内の障害物として利用します。
障害物を複製して配置する
1つだけでは少し寂しいため、Obstacle_01を複製して複数の障害物を配置します。
今回は3つ作成します。
例えば、次のような位置と大きさに設定します。
Obstacle_01
Position = X 4 / Y 1 / Z 2
Scale = X 2 / Y 2 / Z 2
Obstacle_02
Position = X -4 / Y 1 / Z 5
Scale = X 3 / Y 2 / Z 1
Obstacle_03
Position = X 0 / Y 1 / Z -5
Scale = X 1 / Y 2 / Z 4
同じCubeでもScaleを変えることで、形の異なる障害物として利用できます。
すべての障害物をObstaclesの子GameObjectとして整理しておきます。

Playモードで障害物との当たり判定を確認する
障害物を配置したら、Playモードで動作を確認します。
Unity上部のPlayボタンを押し、Gameビューをクリックします。
W・A・S・DキーでPlayerをObstacle_01まで移動させます。
Playerが障害物に接触したところで停止し、そのまま障害物を通り抜けなければ成功です。

Obstacle_02やObstacle_03についても同じように確認します。
さらに、障害物を避けながらゲームエリア内を移動できるか試してみます。
壁だけだったときよりも、どこを通るかを考えながらPlayerを操作する必要があるため、少しゲームらしい空間になります。
Materialを使ってゲームエリアを見やすくする
現在はGroundや壁、障害物が似たような見た目になっているため、どれが何なのか少し分かりにくい状態です。
そこでMaterialを使って色を変更します。
Materialは以前Playerの色を変更するときにも使用しました。
今回は、
GroundMaterial
WallMaterial
ObstacleMaterial
の3つを作成します。
それぞれ異なる色にして、ゲームエリアの役割が見た目でも分かるようにします。
例えば、
Ground = 緑系
Wall = グレー系
Obstacle = オレンジ系
のようにすると、Playerや背景とも区別しやすくなります。
色は完全に同じでなくても問題ありません。
自分が見やすいと思う色を選んで大丈夫です。
GroundMaterialを作成する
Projectウィンドウ内に、
Materials
というフォルダを作成します。
今後Materialが増えても管理しやすいように、Materialはこのフォルダにまとめていきます。
Materialsフォルダ内で新しいMaterialを作成し、
GroundMaterial
という名前にします。
色を緑系に変更したら、HierarchyのGroundへMaterialを設定します。
Ground全体の色が変われば成功です。

WallMaterialを作成する
次に、
WallMaterial
を作成します。
今回はグレー系など、Groundとは違う色にします。
作成したWallMaterialを、
Wall_North
Wall_South
Wall_East
Wall_West
の4つへ設定します。
4つすべての壁が同じ色になれば、ゲームエリアの境界が分かりやすくなります。
同じMaterialを複数のGameObjectで使うことができるため、壁ごとに新しいMaterialを作る必要はありません。

ObstacleMaterialを作成する
最後に、
ObstacleMaterial
を作成します。
今回は障害物が目立つように、オレンジ系などGroundや壁とは異なる色にしてみます。
作成したObstacleMaterialを、
Obstacle_01
Obstacle_02
Obstacle_03
へ設定します。
これでPlayer、Ground、壁、障害物を見た目でも区別できるようになります。

同じMaterialを複数のGameObjectで使える
Unityでは、1つのMaterialを複数のGameObjectに設定できます。
例えば今回のWallMaterialは、4つすべての壁に使用しています。
その状態でWallMaterialの色を変更すると、そのMaterialを使用しているすべての壁の見た目も変更されます。
ObstacleMaterialについても同じです。
3つの障害物へ同じMaterialを設定しておけば、後から一括で見た目を変更できます。
GameObjectごとに必要以上にMaterialを作らず、同じ見た目にしたいものは同じMaterialを共有すると管理しやすくなります。
HierarchyとProjectを整理する
ここまで進めると、Scene内のGameObjectとProject内のAssetが少しずつ増えてきます。
Hierarchyでは、
Main Camera
Directional Light
Ground
Player
Walls
├─ Wall_North
├─ Wall_South
├─ Wall_East
└─ Wall_West
Obstacles
├─ Obstacle_01
├─ Obstacle_02
└─ Obstacle_03
のような状態になります。
Project側でも、
Assets
├─ Materials
└─ Scripts
のように種類ごとにフォルダを分けておくと管理しやすくなります。
ゲーム制作が進むと、スクリプト・Material・3Dモデル・画像・音声など大量のAssetを扱うようになります。
最初の段階から分かりやすい名前とフォルダを使って整理することが大切です。
ゲームエリアを実際に歩いて確認する
最後にPlayモードにして、完成したゲームエリアを実際に操作して確認します。
PlayerをW・A・S・Dキーで移動させ、
壁を通り抜けないか、
障害物を通り抜けないか、
障害物の間を移動できるか、
ゲームエリアの見た目が分かりやすくなっているか、
を確認します。
設定画面だけを見るのではなく、実際にゲームを操作して確認することが重要です。
問題があれば、障害物のPositionやScaleを変更して調整できます。

今回のまとめ
今回はUnity 6のゲームエリア内にCubeを使った障害物を配置しました。
障害物にはCubeのBox Colliderをそのまま利用し、Playerが障害物を通り抜けないことを確認しました。
また、Ground・壁・障害物用のMaterialを作成し、それぞれ色を変更しました。
これによって、これまでよりもゲームエリアの各GameObjectを見分けやすくなりました。
さらに、HierarchyではWallsやObstaclesを使ってGameObjectを整理し、ProjectではMaterialsフォルダを作成しました。
ゲーム制作では機能を追加するだけでなく、GameObjectやAssetを整理しながら進めることも重要です。
次回はアイテムを配置する
ゲームエリアと障害物ができたので、次はPlayerが触れることのできるアイテムを作成します。
例えばゲームエリア内にアイテムを配置し、
Playerがアイテムに触れる
↓
アイテムを取得する
↓
アイテムが消える
という簡単な仕組みを作ります。
ここではColliderの
Is Trigger
についても確認します。
さらに、AIに相談しながらアイテム取得用のC#スクリプトを作成し、これまで作ってきたゲームエリアに最初のゲームらしい機能を追加していきます。

