こんにちは!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でビルドしてみました。マウス左クリックでボールが発生しますが、ボールが消去されるまでは次のボールを発生させないようにできました。