Unity本の作例改造-Chapter3-4:ボールを連続して発生できないようにする

こんにちは!Unityの入門書で通称”ヒヨコ本”として親しまれている”Unity5入門 最新開発環境による簡単3D&2Dゲーム制作 “の作例に色々とゲーム要素を追加してオリジナルゲームに仕上げる内容を連載をしています。


Chapter1:Unityの概要と基礎知識
Chapter2:インターフェイスと使い方
Chapter3:Unityを使ってみよう!
Chapter4:キャラクターを動かしてみよう!
Chapter5:ゲームのUIを作ってみよう!
Chapter6:ゲームを作ろう!(1)
Chapter7:ゲームを作ろう!(2)
Chapter8:2D機能を使ってみよう!

スタートボタンをクリックしたらタイトル画面を消去してゲームを開始する

前回作成したタイトル画面のスタートボタンのクリックでタイトル画面の消去とゲームスタートの処理を追加します。

タイトル画面UIオブジェクト”Canvas”にスクリプトを作成して割り当てる

今回はスクリプトコンポーネントをUIオブジェクト”Canvas”に割り当てることにしました。
[Hierarchy]ウィンドウ > Canvasを選択。
[Inspector]ウィンドウ > [Add Component]ボタン > New Script を選択。
下記の通りに設定。
Name: ButtonStart / Language: C Sharp

[Create and Add]ボタンをクリック。[Project]ウィンドウに作成したスクリプト”ButtonStart”が表示されていることを確認します。

スクリプトの編集

スクリプト”ButtonStart”をダブルクリックしてエディターを起動。下記のコードを入力します。
ゲームスタート直後にゲームは一時停止。スタートボタンを押すと一時停止が解除されます。

using System.Collections;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PanelTitle : MonoBehaviour
{
    // タイトル画面UIオブジェクトを格納する変数
    public GameObject panelTitle;

    // ゲームの初期処理
    void Start()
    {
        // ゲーム時間の進行速度を"0"に設定して一時停止
        Time.timeScale = 0;
    }

    // ボタンをクリックした時に実行する処理
    public void StartScene()
    {
        // ゲーム時間の進行速度を"1"に設定して再生する
        Time.timeScale = 1.0f;
        // スタートボタンを非表示にする
        panelTitle.SetActive(false);
    }
}

スクリプト”PanelTitle”の変数”panelTitle”フィールドにタイトル画面のUIオブジェクトを割り当て

[Hierarchy]ウィンドウ > Canvas を選択。
[Inspector]ウィンドウ > ButtonStart (Script) > Panel Titleフィールドの右側にある◎ボタンをクリック。
ファイル選択ウィンドウが開いたら”Panel Title”オブジェクトをダブルクリックで選択して割り当てます。

スタートボタンをクリックしたらスクリプトを実行する設定

[Hierarchy]ウィンドウ > Canvas > Panel Title > Button Start を選択。
[Inspector]ウィンドウ > Button (Script) > On Click () パネル左側のフィールドに[Hierarchy]ウィンドウ > Canvasをドラッグして割り当てます。
On Click () パネル右側の[No Function] > Panel Title > StartScene を選択します。

動作確認

ここまでの内容をWebGLでビルドしてみました。タイトル画面のスタートボタンをクリックするとタイトル画面が非表示になってゲームが開始。ボールが発生します。

ゲームの設定を管理するオブジェクトとスクリプトを作成する

これらか色々とゲーム機能を追加していきますが、あらかじめゲーム機能として必要になるボール残数やスコアなど、各種パラーメータ処理のためにゲーム管理用のスクリプトを用意しておくことにしました。

ゲーム管理オブジェクトの作成

まずはゲーム管理スクリプトを割り当てるオブジェクトをシーンに作成します。
[Hierarchy]ウィンドウ > [Create]ボタン > Create Empty を選択。
オブジェクトを右クリック > Rename を選択。オブジェクト名を”Manager”に変更。
[Inspector]ウィンドウ > Transform の右側にある 歯車アイコンをクリック > Reset を選択。

ゲーム管理スクリプトの作成

[Hierarchy]ウィンドウ > オブジェクト”Manager”を選択。
[Inspector]ウィンドウ > [Add Component]ボタン > New Scriptを選択して下記の通り入力。
Name: Manager / Language: C Sharp
[Create and Add]ボタンをクリック。

ゲーム管理スクリプト”Manager”の編集

作成したスクリプト”Manager”を編集します。ひとまず下記の変数を用意します。

public static int ballCount
ボール残数管理用の変数
public static int score
スコア管理用の変数
public static bool ballExist
シーンにボールが存在するかチェックする変数
public static bool gameTitle
ゲームタイトル画面が表示されているかチェックする変数
public static bool gameOver
ゲームオーバー画面が表示されているかチェックする変数

ボール残数とスコアについては ゲームの難易度や動作調整のために[Inspector]ウィンドウから初期値を入力できるよう、下記の変数を用意しました。

public int initialBallCount
ボール残数の初期値を設定する変数
public int initialScore
スコアの初期値を設定する変数

コードは下記の通りになります。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Manager : MonoBehaviour
{
    // スクリプト間で受け渡し用に使用する変数
    // ボール残数管理用の変数
    public static int ballCount;
    // スコア管理用の変数
    public static int score;
    // シーンにボールが存在するかチェックする変数
    public static bool ballExist;
    // ゲームタイトル画面が表示されているかチェックする変数
    public static bool gameTitle;
    // ゲームオーバー画面が表示されているかチェックする変数
    public static bool gameOver;

    // ゲーム初期値設定用の変数
    // ボール残数の初期設定値を設定する変数
    public int initialBallCount;
    // スコアの初期値を設定する変数
    public int initialScore;

    // ゲームの初期化
    void Start()
    {
        // [Inspector]ウィンドウのコンポーネントパネルで設定した
        // 初期値"initialBallCount"の値を受け渡し用変数(static)に代入
        ballCount = initialBallCount;
        // [Inspector]ウィンドウのコンポーネントパネルで設定した
        //初期値"initialScore"の値を受け渡し用変数(static)に代入
        score = initialScore;
        // 変数の初期値入力
        ballExist = false;
        gameTitle = true;
        gameOver = false;
    }
}

スクリプトを保存するとオブジェクト”Manager”の[Inspector]ウィンドウは下記の通りになります。

ボールを連続して発生できないようにする

ゲーム管理スクリプト”Manager”が用意できたので、まずはマウスを連続してクリックしてもシーンにボールが存在する場合はボールを発生させないように改造してみましょう。

ボールを発生するスクリプト”Spawner”を変更する

ボールを発生するスクリプト”Spawner”の中でゲーム管理スクリプト”Manager”の変数”ballExist”を呼び出して値を変更します。
[Project]ウィンドウ > スクリプト”Spawner”をダブクリクリックで開き、コードを変更します。下記コードのマーカー行が変更した部分です。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Spawner : MonoBehaviour
{
    // シーンに発生させるオブジェクトを格納する変数"prefab"を宣言
    public GameObject prefab;

    // ゲーム実行中の繰り返し処理
    void Update()
    {
        // マウス左クリック(ボタン"Fire1")したとき
        if (Input.GetButtonDown("Fire1")
             // シーンにボールが存在しなければ
             // (スクリプト"Manager"の変数"ballExist"の値を参照)
            && !Manager.ballExist
            )
        {
            // 変数"prefab"に格納されたプレハブをシーンに発生させる
            Instantiate(prefab, transform.position, transform.rotation);
            // シーンにボールが存在するかチェックする変数を"true"にする
            // (スクリプト"Manager"の変数"ballExist"の値を変更)
            Manager.ballExist = true;
        }
    }
}

ボールを消去するスクリプト”DestroyBall”を変更する

スクリプト”Spawner”の処理内で変更した変数”Manager.ballExist”の値をボールを消去する時に変更して、再びボールを発生させることができるようにします。
[Project]ウィンドウ > スクリプト”DestroyBall”をダブクリクリックで開き、コードを変更します。下記コードのマーカー行が変更した部分になります。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class DestroyBall : MonoBehaviour
{
    // オブジェクトに接触したらボールを削除する処理
    void OnCollisionEnter(Collision col)
    {
        // 接触するオブジェクトのタグが"Floor"であれば
        if (col.gameObject.tag == "Floor")
        {
            // オブジェクトを1秒後に削除する
            Destroy(gameObject, 1.0f);
            // シーンにボールが存在するかチェックする変数を"false"にする
            // (スクリプト"Manager"の変数"ballExist"の値を変更)
            Manager.ballExist = false;
        }
    }
}

動作確認

ここまでの内容をWebGLでビルドしてみました。マウス左クリックでボールが発生しますが、ボールが消去されるまでは次のボールを発生させないようにできました。

スポンサーリンク
スポンサーリンク

スポンサーリンク

フォローする