ゲーム管理オブジェクトを作る

さて、ゲームにはタイトルから始まってゲームオーバーで終わるという流れがあり、その中で様々な処理が行われます。このときそれぞれの処理をバラバラに行ってしまうとゲームを成り立たせるのがとても難しくなるので、できればゲームを統括する「監督」的なものを作っておきたいものです。

そこで今回作るのが、ゲーム進行を管理するゲーム管理オブジェクトです。このオブジェクトではスタート画面を表示したり、スコアを加算したりするなどゲーム進行に必要な処理をまとめて行います。

ゲーム管理オブジェクトのプログラム

それではゲーム管理オブジェクトを作っていきましょう。空のゲームオブジェクトを作成し、名前を「GameManager」に変更してください。そして新しいC#スクリプトを作成し、こちらも名前を「GameManager」としてください。スクリプトを開いたら以下のソースコードを記入します。

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

public class GameManager : MonoBehaviour {

	//インスペクタに表示しないpublic変数
	[System.NonSerialized]
	public int level = 1;
	[System.NonSerialized]
	public int score = 0;
	[System.NonSerialized]
	public bool playing = false;

	//インスペクタに表示するprivate変数
	[SerializeField]
	GameObject player;
	[SerializeField]
	int levelUpTime = 6; //レベルアップするまでの時間
	[SerializeField]
	int maxLevel = 10;
	[SerializeField]
	float addScoreInterval = 6; //スコア加算間隔
	[SerializeField]
	int addScoreCofficient = 1; //スコア加算係数
	[SerializeField]
	float playerSpawnX = -7.0f;
	[SerializeField]
	float playerSpawnY = 3.0f;

	//インスペクタに表示しない変数
	int highScore = 0;
	string highScoreKey = "highScore";

	//UI取得用
	[SerializeField]
	Image titleLogoImg;
	[SerializeField]
	Text clickStartTxt;
	[SerializeField]
	Text gameOverTxt;
	[SerializeField]
	Text tryAgainTxt;
	[SerializeField]
	Text scoreLabelTxt;
	[SerializeField]
	Text scoreNumTxt;
	[SerializeField]
	Text highLabelTxt;
	[SerializeField]
	Text highNumTxt;

	//初期化
	void Start ()
	{
		
	}
	
	//毎フレームの処理
	void Update ()
	{
		//ゲーム中の処理
		if (playing)
		{
			if (highScore < score)
			{
				highScore = score;
			}

			//スコアを表示
			scoreNumTxt.text = score.ToString("d6");
			highNumTxt.text = highScore.ToString("d6");
		}
		//タイトルまたはゲームオーバー
		else
		{
			//クリックされたらゲーム開始
			if (Input.GetMouseButtonDown(0))
			{
				StartGame();
			}
		}
	}

	//ゲーム開始処理
	void StartGame()
	{
		//ガベージコレクション実行
		System.GC.Collect();

		//初期化
		score = 0;
		level = 1;

		//ハイスコア読み込み
		highScore = PlayerPrefs.GetInt(highScoreKey, 0);

		//タイトルまたはゲームオーバー画面非表示
		titleLogoImg.enabled = false;
		clickStartTxt.enabled = false;
		gameOverTxt.enabled = false;
		tryAgainTxt.enabled = false;

		//スコアを表示
		scoreLabelTxt.enabled = true;
		scoreNumTxt.enabled = true;
		highLabelTxt.enabled = true;
		highNumTxt.enabled = true;

		playing = true;

		//もし地形やコインが残ってたら消去
		DeleteObjects("Wall");
		DeleteObjects("Item");

		//プレイヤー生成
		Instantiate(player, new Vector3(playerSpawnX, playerSpawnY, 0.0f), Quaternion.identity);

		//ゲーム開始後、一定時間ごとの処理
		InvokeRepeating("LevelUp", levelUpTime, levelUpTime);
		InvokeRepeating("AddScoreByTime", addScoreInterval, addScoreInterval);
	}

	//ゲームオーバー処理
	public void GameOver()
	{
		CancelInvoke();
		playing = false;

		// ハイスコアを保存
		PlayerPrefs.SetInt(highScoreKey, highScore);
		PlayerPrefs.Save();

		//ゲームオーバー画面表示
		gameOverTxt.enabled = true;
		tryAgainTxt.enabled = true;
	}

	//スコア加算
	void AddScoreByTime()
	{
		score += addScoreCofficient * (10 + level - 1);

		Debug.Log(score);
	}

	//レベルアップ
	void LevelUp()
	{
		if (level < maxLevel)
		{
			level++;

			Debug.Log(level);
		}
	}

	//ゲームオブジェクトの一括削除
	void DeleteObjects(string tag)
	{
		GameObject[] deleteObjects = GameObject.FindGameObjectsWithTag(tag);

		if (deleteObjects.Length > 0)
		{
			foreach (GameObject obj in deleteObjects)
			{
				Destroy(obj);
			}
		}
	}
}

プログラムの解説

変数宣言

使っている変数の意味は変数名とコメントの通りなので省略します。

毎フレームの処理

もしゲーム中なら、スコアの表示を更新します。ゲーム中でなければ(タイトルかゲームオーバー画面なら)クリックしたらゲームを開始します。

ゲーム開始処理

ここはゲームを始めた瞬間に行う処理です。まず、ガベージコレクションを実行します。ガベージコレクションというのは、メモリの無駄な領域を整理することです。こうすることで快適にゲームを遊ぶことができます。

それからタイトル画面やゲームオーバー画面を非表示にして、スコアを表示します。もし地形やコインが残っていたら消去して、プレイヤーを出現させます。

最後に、ゲーム開始後に一定時間ごとに実行される処理を開始します。この処理はInvokeRepeatingというメソッドを使うと簡単に実現できます。

ゲームオーバー処理

ゲームオーバーになった時の処理です。一定時間ごとの処理を停止し、ハイスコアを保存してゲームオーバー画面を表示します。

スコア加算

スコアを加算します。

レベルアップ

レベルを1つ上げます。

ゲームオブジェクトの一括削除

タグでゲームオブジェクトを探し、該当するタグがつけられたゲームオブジェクトをすべて削除します。

GameManagerコンポーネントにUIを登録する

ソースコードが書けたら、インスペクタからGameManagerコンポーネントにUIを登録していきます。下の図のようにUIのゲームオブジェクトをコンポーネントの欄にドラッグ&ドロップしてください。
UIをGameManagerに登録する

プレイヤーのプレハブを作る

最後に、プレイヤーのプレハブを作ります。プレハブというのは簡単に複製できるオブジェクトのことです。プレハブを作っておくと、スクリプトからオブジェクトを自動生成できるようになります。また、元のプレハブを変更すればその変更が複製したオブジェクトにも反映されるので、特に同じオブジェクトを大量に扱う時にとても便利です。

プレハブの作り方は簡単で、PlayerオブジェクトをPrefabsフォルダにドラッグ&ドロップするだけです。プレハブが作成されたのを確認したらシーンにあるPlayerオブジェクトは削除してしまって構いません(削除する前によく確認してください)。

これでゲーム管理オブジェクトが機能するようになりました。

次のページ→障害物のオブジェクトを作る

コメントを残す

メールアドレスが公開されることはありません。