では弾薬ゲージができたところで、そろそろゲーム管理オブジェクト(GameManager)を作っておきましょう。
今回作るGameManagerは、ゲームを始めたりゲームオーバーの時の処理を実行したりする役割を担当します。ゲームの裏方部分を一手に担うオブジェクトなので、まさに縁の下の力持ちといった感じですね。
テキストの追加
さて、まずGameManagerを作る前に、前回作ったキャンバスの中央に「Game Over」などの文字を表示するテキストオブジェクトを追加しておきます。「UI」→「テキスト」からテキストを作成し、大きさを適当なサイズにして文字の整列を中央にしておいてください。
GameManagerのオブジェクトの作成
そうしたら次にGameManagerのオブジェクトを作成します。
空のゲームオブジェクトを作成し、名前を「GameManager」、タグを「GameController」に設定してください。なお、タグは今後このゲームオブジェクトを検索するときに参照するので必ず設定しておいてください。
GameManagerのC#スクリプト
それではGameManagerのC#スクリプトを書いていきます。
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class GameManager : MonoBehaviour { [SerializeField] int maxScore = 99999999; [SerializeField] Text scoreText; [SerializeField] FirstPersonAIO firstPerson; [SerializeField] FirstPersonGunController gunCOntroller; [SerializeField] Text centerText; [SerializeField] float waitTime = 2; [System.NonSerialized] public bool gameOver = false; int score = 0; public int Score { set { score = Mathf.Clamp(value, 0, maxScore); scoreText.text = score.ToString("D8"); } get { return score; } } void Start() { InitGame(); StartCoroutine(GameStart()); } void InitGame() { Score = 0; firstPerson.playerCanMove = false; firstPerson.enableCameraMovement = true; gunCOntroller.shootEnabled = false; } public IEnumerator GameStart() { yield return new WaitForSeconds(waitTime); centerText.enabled = true; centerText.text = "3"; yield return new WaitForSeconds(1); centerText.text = "2"; yield return new WaitForSeconds(1); centerText.text = "1"; yield return new WaitForSeconds(1); centerText.text = "GO!!"; firstPerson.playerCanMove = true; firstPerson.enableCameraMovement = true; gunCOntroller.shootEnabled = true; yield return new WaitForSeconds(1); centerText.text = ""; centerText.enabled = false; } public IEnumerator GameOver() { gameOver = true; firstPerson.playerCanMove = false; firstPerson.enableCameraMovement = false; gunCOntroller.shootEnabled = false; centerText.enabled = true; centerText.text = "Game Over"; yield return new WaitForSeconds(waitTime); DestroyEnemies(); centerText.text = ""; centerText.enabled = false; gameOver = false; } void DestroyEnemies() { GameObject[] enemies = GameObject.FindGameObjectsWithTag("Enemy"); foreach(GameObject enemy in enemies) { Destroy(enemy); } } }
書けたらこのスクリプトを先ほど作ったゲームオブジェクトにアタッチし、空欄に各コンポーネントをもつゲームオブジェクトをヒエラルキーからドラッグ&ドロップしてください(下記参照)。
- Score Text:スコアの数値部分
- First Person:プレイヤーキャラ
- Gun Controller:GunController
- Center Text:先ほど作ったテキスト
スクリプトの解説
難しいことは全くやっていないのでごく簡単に説明しますね。
GameStart()メソッド
ゲーム開始時のカウントダウンなどを行うコルーチンです。3,2,1…とカウントダウンしてからプレイヤーを動かせるようにします。
GameOver()メソッド
ゲームオーバー時の処理を行うコルーチンです。プレイヤーの動きを止めたり、「GameOver」の文字を表示したりします。一定時間が経過するとゲームオーバー状態が解除されます。
DestroyEnemies()メソッド
ゲームオーバー時にすべての敵キャラを探してDestroyするメソッドで、新しくゲームを始めるときに前の敵キャラが残っていないようにするためのものです。
ここまででゲーム開始~ゲームオーバーまでの流れができました。しかしまだGameManagerは完成ではありません。後々機能を追加することになるでしょう。