こんにちは!Unityの入門書で通称”ヒヨコ本”として親しまれている”Unity5入門 最新開発環境による簡単3D&2Dゲーム制作 “の作例に色々とゲーム要素を追加してオリジナルゲームに仕上げる内容を連載をしています。
Chapter2:インターフェイスと使い方
Chapter3:Unityを使ってみよう!
Chapter4:キャラクターを動かしてみよう!
Chapter5:ゲームのUIを作ってみよう!
Chapter6:ゲームを作ろう!(1)
Chapter7:ゲームを作ろう!(2)
Chapter8:2D機能を使ってみよう!
ボールの残数が”0″になったらゲームオーバー画面を表示する
前回の記事”ゲームオーバー画面をつくる“ではゲームオーバー画面を完成するところまで進みました。今回はゲームの設定を管理するスクリプトを作って、ゲームオーバー画面の表示制御を行ってみたいと思います。
ゲームオーバー画面を表示するスクリプトを作成
ゲームオーバー画面を表示させるためのスクリプトを作成します。
[Hierarchy]ウィンドウ > Canvasを選択。[Inspector]ウィンドウ > [Add Component]ボタン > New Script を選択。
下記の通りに設定。
Name: GameOver / Language: C Sharp
[Create and Add]ボタンをクリック。
スクリプト”GameOver”を編集
ゲームオーバーの条件はゲーム管理スクリプト”Manager”の変数”ballCount”の値を使用します。
作成したスクリプト”GameOver”をダブルクリックしてエディターを起動。入力するコードは次の通りです。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class GameOver : MonoBehaviour { // ゲームオーバー画面を格納する変数 public GameObject panelGameOver; // ゲーム中の繰り返し処理 void Update() { // ボールの残数がゼロであれば //(スクリプト"Manager"の変数"ballCount"の値を参照) if (Manager.ballCount == 0) { //ゲームオーバー画面を表示にする panelGameOver.SetActive(true); // ゲームオーバー画面を表示 //(スクリプト"Manager"の変数"gameOver"の値を変更) Manager.gameOver = true; } } }
スクリプト”GameOver”の変数”panelGameOver”にゲームオーバーUIオブジェクトを割り当て
[Hierarchy]ウィンドウ > Canvas を選択。[Inspector]ウィンドウ > GameOver (Script) > Panel Game Overフィールドの右側にある◎ボタンをクリック。
ファイル選択ウィンドウが開いたら”Panel GameOver”オブジェクトをダブルクリックで選択して割り当てます。
動作確認
動作確認をしてみます。
まず[Hierarchy]ウィンドウ > Managerを選択。[Inspector]ウインドウ > Manager (Script) > Initial Ball Count フィールドの値を”2″に設定しておきます。
それから[Hierarchy]ウィンドウ > Canvas > Panel GameOver を選択。[Inspector]ウィンドウのオブジェクト名左側のチェックボックスを外して無効にしておきます。
それでは再生ボタンをクリックして動作を確認してみましょう。
最初のボールが床に接触して消えてもう一度マウスクリックするとすぐにゲームオーバー画面が表示されてしまいます!これはいけない…ということで修正しましょう。
ゲームオーバー画面を表示する条件の追加
現在のゲームオーバー画面が表示される条件”Manager.ballCount == 0″、ボール残数が”0″になると同時にゲームオーバー画面が表示されてしまいます。
スクリプト”GameOver”を編集
最後のボールがシーンに存在する間はゲームが表示されないように条件を追加します。
ゲームオーバー画面が表示される条件は追加する条件とあわせて次の2つになります。
- ballCount == 0:ボールの残数がゼロである
- !ballExist:シーンにボールが存在しない
作成したスクリプト”GameOver”をダブルクリックしてエディターを起動。入力するコードは次の通り。マーカー行が修正した部分になります。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class GameOver : MonoBehaviour { // ゲームオーバー画面を格納する変数 public GameObject panelGameOver; // ゲーム中の繰り返し処理 void Update() { // ボールの残数がゼロであれば //(スクリプト"Manager"の変数"ballCount"の値を参照) if (Manager.ballCount == 0 // さらにシーンにボールが存在しなければ //(スクリプト"Manager"の変数"ballExist"の値を参照) && !Manager.ballExist) { //ゲームオーバー画面を表示にする panelGameOver.SetActive(true); // ゲームオーバー画面を表示 //(スクリプト"Manager"の変数"gameOver"の値を変更) Manager.gameOver = true; } } }
動作確認
ボール残数が”0″の状態でボールが床に接触したらゲームオーバー画面が表示されるようになりました。
しかしゲームオーバー画面が表示されている状態でもゲームは実行されているのでマウスをクリックするとボール残数表示が変化してマイナス表示になってしまいます…修正しましょう。
ゲームオーバー画面表示中はボールを発生できないようにする
ボールの発生条件を追加してゲームオーバー画面が表示されている間はボールを発生できないようにします。
スクリプト”Spawner”を編集
スクリプト”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 // ゲームオーバー画面が表示されていなければ // (スクリプト"Manager"の変数"gameOve"の値を参照) && !Manager.gameOver ) { // 変数"prefab"に格納されたプレハブをシーンに発生させる Instantiate(prefab, transform.position, transform.rotation); // シーンにボールが存在するかチェックする変数を"true"にする // (スクリプト"Manager"の変数"ballExist"の値を変更) Manager.ballExist = true; // ボールの残数を管理する変数の値を減らす // (スクリプト"Manager"の変数"ballCount"の値を変更) Manager.ballCount--; } } }
動作確認
ここまでの内容をWebGLでビルドしてみました。ボール残数が”0″の状態でボールが床に接触したらゲームオーバー画面が表示され、マウスクリックしてもボール残数表示がマイナスになりません。
唐突にゲームオーバー画面が表示されるのでちょっと気になりますが、いずれ改良したいと思います。