前回に引き続き、ゲームの裏方部分を作っていきます。前回の状態だと色々とエラーが出てしまっていると思うので、今回はいくつかのスクリプトを変更してゲームがきちんと動くように修正します。
変更するスクリプトは次の4つです。
- PlayerController
- MoveSceneManager
- SaveData
- SaveManager
では、一つずつ変更点を見ていきましょう。
PlayerController.csの変更
まず、敵やゴールに触れた時にGameManagerの処理を呼び出すようにします。
「プレイヤーのゲームオブジェクト(ランタン)の作り方」で書いたスクリプトの中に「後でコメントを外す」と書かれた行が2か所あると思います。この1つ下の行のコメントアウト(//)を削除しましょう。
MoveSceneManager.csの変更
次にMoveSceneManagerを開いて、OnSceneLoadedメソッドを次のように変更してください。
//シーンのロード時に実行(最初は実行されない) protected virtual void OnSceneLoaded(Scene scene, LoadSceneMode mode) { gameManager.InstantiateWhenLoadScene(); //↓追加 gameManager.ExecWhenLoadScene(); }
これでシーンをロードしたときに必要なメソッドが呼ばれるようになります。
SaveData.csの変更
さて、お次はSaveDataです。次のように変更しましょう。
[System.Serializable] public class SaveData { //挑戦可能なステージのフラグ。trueなら挑戦可能になる public bool[] flags; public float volume = 1.0f; public float bgmVolume = 1.0f; public float seVolume = 1.0f; }
あるステージに挑戦可能かどうかを記録するためのbool型の配列を追加しました。例えばこの配列の要素番号1番がtrueなら、ステージ1に挑戦できるということになります(要素番号0番はタイトル画面に対応しますが使用しません)。
SaveManager.csの変更
最後はSaveManagerです。次のように変更してください(※関係ないところは適宜省略してあります)。
using System.Collections; using System.Collections.Generic; using System.IO; using System.Linq; using UnityEngine; [DefaultExecutionOrder(-10)] public class SaveManager : SingletonMonoBehaviour<SaveManager> { //省略 protected override void Awake() { base.Awake(); string saveFileName = "saveData"; if (Debug.isDebugBuild) { saveFileName += "_test"; } filePath = Application.persistentDataPath + "/" + saveFileName + ".json"; save = new SaveData(); moveSceneManager = GetComponent<MoveSceneManager>(); if (Debug.isDebugBuild) { CreateDebugData(); } else { if (File.Exists(filePath)) { Load(); } else { //ステージ数だけ挑戦可能フラグの要素を生成 save.flags = Enumerable.Repeat<bool>(false, moveSceneManager.NumOfScene).ToArray(); //ステージ1は最初から挑戦可能にする save.flags[1] = true; Save(); } } } //省略 public void SetFlag(int stageIndex) { stageIndex = Mathf.Clamp(stageIndex, 0, moveSceneManager.NumOfScene - 1); save.flags[stageIndex] = true; } public bool GetFlag(int stageIndex) { stageIndex = Mathf.Clamp(stageIndex, 0, moveSceneManager.NumOfScene - 1); return save.flags[stageIndex]; } public void InitSaveData() { save = new SaveData(); } //デバッグ用のセーブデータ void CreateDebugData() { //ステージ数だけ挑戦可能フラグの要素を生成 save.flags = Enumerable.Repeat<bool>(true, moveSceneManager.NumOfScene).ToArray(); } }
先ほどSaveDataのほうで用意した配列を操作するためのメソッドを用意したり、ステージ数分だけ配列の要素を生成する処理を追加したりしました。
これでゲームの裏方部分が一通りできました。ゲームを実行してちゃんと動くかどうかを確かめてみましょう。
次のページ→タイトル画面とステージ選択画面の作り方