こんにちは!Unityの入門書で通称”ヒヨコ本”として親しまれている”Unity5入門 最新開発環境による簡単3D&2Dゲーム制作 “の作例に色々とゲーム要素を追加してオリジナルゲームに仕上げる内容を連載をしています。
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でビルドしてみました。マウス左クリックでボールが発生しますが、ボールが消去されるまでは次のボールを発生させないようにできました。