Skip to content

第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

役割ごとに分けて考える

  • Player

  • Ground

  • Wall

  • Obstacle

  • Goal

  • Canvas

  • GameManager

  • 役割が名前で分かるようにしておくと、後から修正しやすくなります

Prefab 化する候補

複数使うものは部品にする

  • 障害物

  • アイテム

  • ゴールの目印

  • 同じ形を複数置くものは、Prefab にしておくと配置と修正が楽になります

  • 1つしか使わない管理用オブジェクトは、無理に Prefab 化しなくてもかまいません

実習1: Scene の土台を作る

遊ぶための場所を用意する

  1. 新しい Scene を作成して保存する
  2. 床と壁を配置する
  3. Player を配置する
  4. Goal を配置する
  5. Camera と Light を調整する
  6. 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: ゲームとして反応を作る

判定と表示をつなげる

  1. Player に Rigidbody と Collider を設定する
  2. Player に PlayerMove を追加する
  3. Goal に Collider を設定し、Is Trigger を有効にする
  4. Goal に GoalTrigger を追加する
  5. GameManager を用意し、クリア表示を設定する
  6. 再生して、ゴール時に表示が変わることを確認する

遊べる状態に整える

作っただけで終わらせない

  • カメラがプレイヤーとゴールを映しているか
  • UI が読みやすい位置とサイズになっているか
  • Player が速すぎたり遅すぎたりしないか
  • 障害物の当たり判定が見た目と合っているか
  • ゴールまでの道が分かりやすいか

デバッグの進め方

原因を小さく分けて確認する

  • プレイヤーが動かない Rigidbody、Script、入力、速度を確認する
  • ゴール判定が出ない Tag、Is Trigger、参照設定を確認する
  • UI が出ない Canvas、非表示設定、参照設定を確認する
  • Scene が戻ってしまう 保存できているかを確認する

共有

できたところと詰まったところを共有する

  • どの操作で遊ぶゲームにしたか

  • 判定や UI で工夫した点はどこか

  • どこでエラーやつまずきがあったか

  • 次に改善するなら何を直すか

  • 完成度だけでなく、制作中に判断したことも共有します

実習3: 調整して保存する

授業内で遊べる状態にする

  1. プレイヤーの速度を調整する
  2. 障害物の位置を調整する
  3. ゴール表示を見やすくする
  4. Scene を保存する
  5. 再生して最初から最後まで確認する

今回のまとめ

今日のポイント

  • GameObject、Component、Prefab、Collider、UI を組み合わせてミニゲームを作りました
  • 小さな仕様でも、完成条件を決めると作業を進めやすくなります
  • 判定と UI をつなげると、ゲームの状態がプレイヤーに伝わります
  • 次回はここまでの制作を振り返り、AI 活用と Git の使い方を扱います

おつかれさまでした!

次回予告 第07回 Unity振り返り / AI活用 / Git

作ったものを 扱いやすく残します