Appearance
第06回 ミニゲーム実装
前回: 第05回 GUIの実装
前回の振り返り
GUI を使って画面に情報を表示しました
- Canvas の中に Text や Button を配置しました
- RectTransform、Anchor、Pivot の基本に触れました
- スクリプトから Text を更新しました
SetActiveを使って表示を切り替える考え方を確認しました- 今回は、配置、物理、判定、UI を組み合わせてミニゲームを作ります
今回の目的
小さなゲームを最後まで組み立てる
- これまで扱った要素を1つの Scene にまとめる
- プレイヤー、障害物、ゴール、UI の役割を分ける
- 判定に合わせてスコアやクリア表示を更新する
- 完成した Scene を保存し、説明できる状態にする
今回の授業内容
ミニゲーム実装
- 作る内容と完成条件を確認する
- GameObject と Prefab 化する要素を洗い出す
- 実習1: Scene の土台を作る
- プレイヤー操作とゴール判定を作る
- 実習2: ゲームとして反応を作る
- カメラ、ライト、UI を調整して保存する
スクリーンショット指定
後で撮影して差し込む画像
./images/06/minigame-scene-overview.png- Player、Obstacle、Goal、Canvas が配置された Scene 全体が分かる画面
- 差し込み先:
今回作るものまたは必要な GameObject ./images/06/minigame-clear-game-view.png- Game ビューでゴール到達後のクリア表示が読める画面
- 差し込み先:
完成条件または遊べる状態に整える
ミニゲーム実装
小さくても 最後まで作ります
動くものは 強い教材です
今回作るもの
ゴールに到達するミニゲーム
- プレイヤーを動かす
- 障害物を避ける
- ゴールに触れたらクリア表示を出す
- スコアやタイムを UI に表示する
- Scene を保存して、再生すれば遊べる状態にする
完成条件
何ができたら完成かを決める
- プレイヤーが操作で動く
- 床、壁、障害物に Collider がある
- ゴールに Trigger 判定がある
- ゴール到達時にクリア表示が出る
- UI が Game ビューで読める
- 作業内容を保存している
必要な GameObject
役割ごとに分けて考える
PlayerGroundWallObstacleGoalCanvasGameManager役割が名前で分かるようにしておくと、後から修正しやすくなります
Prefab 化する候補
複数使うものは部品にする
壁
障害物
アイテム
ゴールの目印
同じ形を複数置くものは、Prefab にしておくと配置と修正が楽になります
1つしか使わない管理用オブジェクトは、無理に Prefab 化しなくてもかまいません
実習1: Scene の土台を作る
遊ぶための場所を用意する
- 新しい Scene を作成して保存する
- 床と壁を配置する
- Player を配置する
- Goal を配置する
- Camera と Light を調整する
- Canvas にスコアとクリア表示を用意する
- クリア表示は最初は非表示にします
プレイヤーを動かす
入力で Rigidbody を動かす
- 横方向と奥行き方向の入力を受け取ります
- Rigidbody に速度を入れて動かします
- 速さは Inspector で調整できるようにします
cs
using UnityEngine;
public class PlayerMove : MonoBehaviour
{
public float speed = 5f;
Rigidbody rb;
void Start()
{
rb = GetComponent<Rigidbody>();
}
void FixedUpdate()
{
float x = Input.GetAxis("Horizontal");
float z = Input.GetAxis("Vertical");
rb.linearVelocity =
new Vector3(x * speed, rb.linearVelocity.y, z * speed);
}
}ゴール判定
Trigger に入ったらクリアにする
- Player 側に
Playerタグを設定します - Goal 側の Collider は
Is Triggerを有効にします - GameManager への参照を Inspector で設定します
cs
using UnityEngine;
public class GoalTrigger : MonoBehaviour
{
public GameManager gameManager;
void OnTriggerEnter(Collider other)
{
if (other.CompareTag("Player"))
{
gameManager.ClearGame();
}
}
}GameManager
ゲーム全体の状態をまとめる
- クリア表示の切り替えを担当します
- ゲーム全体に関わる処理を置く場所として 扱いますが、今回は小さく作ります 複雑な管理は次回以降に実装します
cs
using UnityEngine;
public class GameManager : MonoBehaviour
{
public GameObject clearText;
public void ClearGame()
{
clearText.SetActive(true);
Debug.Log("Clear");
}
}実習2: ゲームとして反応を作る
判定と表示をつなげる
- Player に Rigidbody と Collider を設定する
- Player に
PlayerMoveを追加する - Goal に Collider を設定し、
Is Triggerを有効にする - Goal に
GoalTriggerを追加する - GameManager を用意し、クリア表示を設定する
- 再生して、ゴール時に表示が変わることを確認する
遊べる状態に整える
作っただけで終わらせない
- カメラがプレイヤーとゴールを映しているか
- UI が読みやすい位置とサイズになっているか
- Player が速すぎたり遅すぎたりしないか
- 障害物の当たり判定が見た目と合っているか
- ゴールまでの道が分かりやすいか
デバッグの進め方
原因を小さく分けて確認する
- プレイヤーが動かない Rigidbody、Script、入力、速度を確認する
- ゴール判定が出ない Tag、Is Trigger、参照設定を確認する
- UI が出ない Canvas、非表示設定、参照設定を確認する
- Scene が戻ってしまう 保存できているかを確認する
共有
できたところと詰まったところを共有する
どの操作で遊ぶゲームにしたか
判定や UI で工夫した点はどこか
どこでエラーやつまずきがあったか
次に改善するなら何を直すか
完成度だけでなく、制作中に判断したことも共有します
実習3: 調整して保存する
授業内で遊べる状態にする
- プレイヤーの速度を調整する
- 障害物の位置を調整する
- ゴール表示を見やすくする
- Scene を保存する
- 再生して最初から最後まで確認する
今回のまとめ
今日のポイント
- GameObject、Component、Prefab、Collider、UI を組み合わせてミニゲームを作りました
- 小さな仕様でも、完成条件を決めると作業を進めやすくなります
- 判定と UI をつなげると、ゲームの状態がプレイヤーに伝わります
- 次回はここまでの制作を振り返り、AI 活用と Git の使い方を扱います