連打ゲームの作り方

執筆者:

カテゴリ:

「時間内に何回連打できるか」ゲームを作りたいと思います。

まずはどんなゲームなのかを体験してみてください。

連打ゲームの作成工程 

0.実際にゲームをプレイ

1.ビルド設定の変更

2.画面比率の固定

3.UIパネル作成

4.「StartPanel」

5.「GamePanel」

6.「ResultPanel」

1.ビルド設定の変更:

Build Settings を開き、プラットフォームを WebGL に切り替える。

今回は作ったゲームを実際にWEB上でアップロードするのが目的です。

なのでプラットフォームをWEB用に変える必要があります。

これをしないと例えゲームを完成できたとしても、ネットにこのゲームをアップロードできないもしくは不具合が起こる可能性があります。

後からでも設定はできますが一番最初にやることを推奨します。

メニューバーの File をクリックし、Build Profiles(Ctrl + Shift + B)を選択してください。

左側の「Platforms」リストに「Web」があるか確認してください。

右側にある「Add Build Profile」ボタンを押します。

すると「Web用のビルド設定」が開きます。

ここは基本的になにも押さずにもう一回「Add Build Profile」を押しましょう。

するとこのような画面になります。しっかりと左下の「Build Profiles」に「Web」が追加さえていますね。

これでビルド設定は完了です。

もしうまくいかない場合

もしかするとWEBGLモジュールがこのようにインストールされていない可能性があります。

この場合は一回プロジェクトを保存してから一回終了します。

インストールの管理の部分から「WEB Build Support」にチェックを入れてインストールしましょう。

インストールが終わったらまた起動してもう一度やってみてください。これで元の手順通りに表示されるはずです。

画面比率の固定:

Game ビューの解像度を 9:16

画面比率(アスペクト比)の固定は、Webゲーム開発において「誰がどこで見ても同じ見た目になるようにする」ための非常に重要な工程です。

これを行うことによってPCの縦長画面でも、スマホのブラウザでも、「意図した通りの配置」で表示されます。

画面上部にある「Game」タブをクリックしてGameビューを表示します。

そしてGameビューの左上に「Free Aspect」と書かれたプルダウンメニューがあるので、そこをクリックしてください。

一覧の中に「9:16」があればそれを選びます。もし無ければ、一番下の 「+」ボタン を押してください。

Type:「Fixed Resolution(固定解像度)」を選択。

Width: 1080

Height: 1920

名前を「Portrait 9:16」などにしてOKを押します。

メニューの中から今作った「Portrait 9:16」を選択します。

今回はスマホで見ている読者にも快適に遊んでほしいので、9:16(縦画面)の設定にしています。

3.UIパネル作成:

StartPanel(スタートボタン)、GamePanel(スコア/タイマー)、ResultPanel(結果表示)の3つをCanvas内に配置する。

「Canvas(キャンバス)」というUIを置くための専用の画用紙をシーンに配置します。何を言っているんだ?と思うかもしれません。なので詳しく説明していきます。

なぜ「Canvas」が必要なのか?

Unityでゲーム画面上に「ボタン」や「スコア表示」などのUIを出す場合、必ずCanvasという枠の中に配置しないと画面に正しく表示されません。

たとえば映画の世界を想像してみてください。

映画の画面に「スコア」や「ボタン」という字幕(UI)を入れたいとします。

もし、映画のセットの中に直接「スコア」という看板を置くとどうなるでしょうか?

  • 俳優が走って後ろに行ったら、スコアも一緒に遠くへ行ってしまう。
  • カメラを横に向けたら、スコアが見えなくなってしまう。
  • 俳優にぶつかって、スコアが倒れてしまう。

これではゲームのUIとして機能しませんよね。

俳優(キャラクター)がどこへ行こうが、カメラをどう振ろうが、アクリル板に書かれた字幕(スコアやボタン)は常に画面の同じ位置に固定されていて、いつでも読める状態になります。

Canvas の中にパネルを3つ作る

では実際に作っていきましょう。

「Hierarchy」上で「右クリック」→「UI(Canvas)」→「Image」

わかりやすいように名前を「StartPanel」にしましょう。

「右クリック」→「Rename」で名前を変更できる。

同様の手順で2つ作り、名前をそれぞれ「GamePanel」、「ResultPanelにしましょう。

「StartPanel」 を右クリックし、「Duplicate(複製)」を2回行い、名前を変更するとスムーズにできる。

「Hierarchy」がこのような状態になっていれば成功です。

配置とサイズを整える

「StartPanel」 を選択。

「Inspector」の「Rect Transform」 の四角いアイコン(アンカー設定)をクリックします。

Alt (Macは Option) を押しながら、右下の「Stretch – Stretch」(四角い枠が全て広がるアイコン)をクリックします。

これでパネルがCanvas全体にぴったりフィットします。

残り2つのパネル(GamePanel, ResultPanel)にも同じ設定を行ってください。

各パネルに「必要な部品」を置く

次に各パネルの中にボタンやテキストを配置します。「Hierarchy」で各パネルを右クリックし、必要なUIを追加します。

StartPanelの中:

  • UI > Button – TextMeshPro を追加(「スタート」ボタン)。

GamePanelの中:

  • UI > Text – TextMeshPro を2つ追加(スコア用、タイマー用)。

ResultPanelの中:

  • UI > Text – TextMeshPro を1つ追加(最終スコア用)。
  • UI > Button – TextMeshPro を追加(「リトライ」ボタン)。

StartPanelの中

「StartPanel」を「右クリック」→「UI 」→「 Button – TextMeshPro 」を追加(「スタート」ボタン)する。

初回のみ、「 Button – TextMeshPro」 を作成した瞬間に「Import TMP Essentials」という画面が出てきます。

「Import TMP Essentials」ボタンを押してください。 これをやらないと日本語フォントが表示されません。

下の「Import TMP Examples & Extras」は押さなくてもいいです。

これはおまけみたいなものなのでデータの節約のためにも×を押しちゃいましょう。

このように表示されたら完了です。

一様区別するために名前を「StartButton」に変更しましょう。

GamePanelの中

名前を区別するため、「ScoreText」「TimerText」とそれぞれ名前を変更しましょう。

このように表示されたら完成です。

ResultPanelの中:

右クリック」→「UI 」→「 Text – TextMeshPro 」を追加(最終スコア表)する。名前を「FinalScore」にする。

「右クリック」→「UI 」→「 Button – TextMeshPro 」を追加(「リトライ」ボタン)する。名前を「RetryButton」にする。

このように表示されたら完成です。

4.スクリプト作成:

C#スクリプトでの制御

今から「GameManager」という司令塔を作って、プログラムでパネルの表示を管理します。

ここから先は「なんでその操作するの?」「そのコードの意味は何?」といった疑問が何回も出てくるところです。しかしこの疑問は先にゲームを完成させないと理解できないものばかりです。

まず第一の目的は「ゲームを完成させること!」

その後から疑問の解消をしていきましょう。

「GameManager」の作成

「Hierarchy」の何もないところで右クリックし、「Create Empty」を選択。

名前を「GameManager」に変更します。

「Project」ウィンドウで右クリック→「Create」→「Scripting」→「MonoBehaviour Script」 を選択し、名前を GameFlow としてください。

今このような状態です。

下の「Project」ウィンドウに「 GameFlow 」という空のScriptが作られました。

作成した GameFlow スクリプトを、Hierarchyの「GameManager」オブジェクトにドラッグ&ドロップしてアタッチ(取り付け)します。

「GameManager」を選択して左の「Inspector」を見てください。しっかりと「GameManager」のScriptが追加されていますね。

しかし今はScriptの中身が空っぽです。ここからScriptの中身を書いていきましょう。

スクリプトの記述①

下の「Project」ウィンドウにある先ほど作った「GameFlow 」をダブルクリックして開いてください。

このようにVisualStudioが開きました。

ここに以下のコードをコピペして貼り付けてみてください。

public class GameFlow : MonoBehaviour
{
    // [1] パネルを登録するための「枠」を用意する
    public GameObject startPanel;
    public GameObject gamePanel;
    public GameObject resultPanel;

    // [2] ゲーム開始時に最初に呼ばれる(自動実行)
    void Start()
    {
        ShowStart(); // 最初はスタート画面を表示
    }

    // [3] スタート画面を表示する(他のパネルは隠す)
    public void ShowStart()
    {
        startPanel.SetActive(true);  // 表示
        gamePanel.SetActive(false);  // 非表示
        resultPanel.SetActive(false); // 非表示
    }

    // [4] ゲーム画面を表示する
    public void ShowGame()
    {
        startPanel.SetActive(false);
        gamePanel.SetActive(true);
        resultPanel.SetActive(false);
    }

    // [5] 結果画面を表示する
    public void ShowResult()
    {
        startPanel.SetActive(false);
        gamePanel.SetActive(false);
        resultPanel.SetActive(true);
    }
}

貼り付けたら必ず「Ctrl+S」で保存をしましょう。

では元に戻って「Hierarchy」にある「GameManager」を選択し、左側の「Inspector」を見てください。

「GameFlow」のScriptに「StartPanel」「GamePanel」「ResultPanel」の3つの枠が現れました。

今のままでは、プログラムは「どのパネルを消したり出したりすればいいのか」を知りません。

一番最初に作った「Hierarchy」にある「StartPanel」「GamePanel」「ResultPanel」をさっきの枠にドラッグ&ドロップしてください。

これで、プログラムが「あのパネルたちのことね!」と認識できるようになります。

スタートボタンに「ShowGame()」を登録する

次に、スタートボタンを押した時の動作を決めます。

Hierarchy」で、StartPanel の中にある 「StartButton」 を選択します。

「Inspector」を一番下までスクロールし、 「On Click ()」 という項目を探します。

「+」ボタンをクリックします。

「None (Object)」と書かれた枠に、Hierarchyから 「GameManager」 をドラッグ&ドロップして入れます。

その右側のドロップダウン(No Function)をクリックします。

メニューから 「GameFlow」→「ShowGame()」 を探してクリックします。

この状態で、画面上部の 「▶(再生ボタン)」 を押してみてください。「StartButton」をクリックして、画面が切り替われば成功です。

↑「GamePanel」が画面いっぱいに映っていません。もし同じ状況になった人は…

スクリプトの記述②

次に「GameFlow」のScriptに以下のコードをコピーして、今のコードの上から上書きしてください。

using UnityEngine;
using TMPro; // 追加: TextMeshProを使うために必要

public class GameFlow : MonoBehaviour
{
    public GameObject startPanel;
    public GameObject gamePanel;
    public GameObject resultPanel;

    public TextMeshProUGUI scoreText; // スコア表示用の枠
    private int score = 0;            // スコアを保存する変数

  void Start()
  {
    // ゲーム起動時はスタート画面から
    ShowStart();
  }

    public void ShowStart()
    {
        startPanel.SetActive(true);
        gamePanel.SetActive(false);
        resultPanel.SetActive(false);
        score = 0; // スコアをリセット
    }

    public void ShowGame()
    {
        startPanel.SetActive(false);
        gamePanel.SetActive(true);
        resultPanel.SetActive(false);
        score = 0;
        UpdateScoreText();
    }

    // ボタンを押した時に呼ぶ関数
    public void AddScore()
    {
        score++;
        UpdateScoreText();
    }

    void UpdateScoreText()
    {
        scoreText.text = "Score: " + score;
    }

    public void ShowResult()
    {
        startPanel.SetActive(false);
        gamePanel.SetActive(false);
        resultPanel.SetActive(true);
    }
}

すると「GameManager」のInspectorに新たに「Score Text」という枠ができました。

ここに「Score Text」をドラッグ&ドロップして入れます。

連打ボタンの作成

ここで「GamePanel」に新たに「ClickButton」というボタンを追加します。これが連打のボタンになります。

「GamePanel」を「右クリック」→「UI 」→「 Button – TextMeshPro 」を追加する。

今「Hierarchy」はこんな感じになっています。

連打ボタンの配置と微調整

Hierarchyで GamePanel の中にある ClickButton を選択します。

「Scene画面」の左上のツールバーから 「Rect Tool」(キーボードの T を押すと切り替わります)を選択。

今青い点で囲まれた□が連打ボタンになっています。これを好きな場所に移動させます。

ちなみにこの画面は「StartPanel」を2回連続クリックすると全体を見通せる画面になります。

私はこんな感じにど真ん中に「ClickButton」を配置しました。

Anchor Preset を使って位置を固定する

Inspectorの 「Rect Transform」 の左上にある 「十字のアイコン(Anchor Preset)」 をクリックします。

ここで 「Center Middle(中央)」 のアイコン(ちょうどど真ん中にあるやつ)をクリックしてください。

これで「どんな画面サイズでも、このボタンは必ず中央に配置される」というルールが完成しました。

この設定をしたあと、Inspectorの 「Pos Y」 を調整して、画面下部からどれくらい上に浮かせたいか(例:50 や 100 など)を入力して微調整してください。

Score・TimerTextの配置を設定する。

「GamePanel」や「ClickButton」と同じように好きな位置に配置しましょう。

今現時点では二つとも中央に配置されているため、右上などの「ClickButton」の邪魔にならない場所に移動させましょう。

また文字の色は白になっているため、Inspectorの「Vertex Color」を黒にしましょう。

これで背景と同化するのを避けます。

「▶(再生ボタン)」 を押して確認してみましょう。(Scene画面では「StartPanel」が手前に来ているので表示されません)

「連打ボタン」への接続

Hierarchyの ClickButtonに、連打機能を紐付けます。

Hierarchy で 「ClickButton」 を選択します。

Inspector の一番下 「On Click ()」 に「+」を押して枠を追加します。

Hierarchy から 「GameManager」 をその枠へドラッグ&ドロップします。

右側のドロップダウンで 「GameFlow」→「AddScore()」 を選択します。

これは以前やった「StartButton」の設定と同じ工程です。

スクリプトの記述③

次に「GameFlow」のScriptに以下のコードをコピーして、今のコードの上から上書きしてください。

using UnityEngine;
using TMPro;

public class GameFlow : MonoBehaviour
{
    public GameObject startPanel;
    public GameObject gamePanel;
    public GameObject resultPanel;

    public TextMeshProUGUI scoreText;
    public TextMeshProUGUI timerText; // タイマー用テキスト

    private int score = 0;
    private float timeRemaining = 10.0f; // 制限時間
    private bool isPlaying = false;      // ゲーム中かどうか

   void Start()
  {
    // ゲーム起動時はスタート画面から
    ShowStart();
  }

    void Update()
    {
        // ゲーム中ならタイマーを減らす
        if (isPlaying)
        {
            timeRemaining -= Time.deltaTime;
            timerText.text = "Time: " + Mathf.Ceil(timeRemaining).ToString();

            if (timeRemaining <= 0)
            {
                ShowResult();
            }
        }
    }

    public void ShowStart()
    {
        isPlaying = false;
        startPanel.SetActive(true);
        gamePanel.SetActive(false);
        resultPanel.SetActive(false);
    }

    public void ShowGame()
    {
        score = 0;
        timeRemaining = 10.0f; // 10秒にリセット
        isPlaying = true;      // ゲームスタート!
        
        startPanel.SetActive(false);
        gamePanel.SetActive(true);
        resultPanel.SetActive(false);
        
        UpdateScoreText();
    }

    public void AddScore()
    {
        if (isPlaying) // ゲーム中だけスコア加算
        {
            score++;
            UpdateScoreText();
        }
    }

    void UpdateScoreText()
    {
        scoreText.text = "Score: " + score;
    }

    public void ShowResult()
    {
        isPlaying = false;
        startPanel.SetActive(false);
        gamePanel.SetActive(false);
        resultPanel.SetActive(true);
    }
}

GameManagerを選択し、Inspectorを見ると「Timer Text」という空の枠が追加されています。

Hierarchy の GamePanel にある 「TimerText」(もし作っていなければ新しく作成してください)を、その枠にドラッグ&ドロップしてください。

これで、ゲーム開始時に「Time: 10」と表示され、自動的にカウントダウンが始まります!

「ResultPanel」の設定

結果画面用のテキストを用意する

「FinalScore」を画面中央の分かりやすい場所に配置してください。

スクリプトの記述④

以下のコードを今のコードに追加してください。

// 追加する変数
    public TextMeshProUGUI resultScoreText; 

    public void ShowResult()
    {
        isPlaying = false;
        startPanel.SetActive(false);
        gamePanel.SetActive(false);
        resultPanel.SetActive(true);

        // 結果画面にスコアを表示!
        if (resultScoreText != null)
        {
            resultScoreText.text = "Final Score: " + score;
        }
    }

Unityでの紐付け

GameManager の Inspector に Result Score Text という枠が新しく増えているはずです。

そこに、作成した「FinalScore」をドラッグ&ドロップしてください。

コメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です