前回に引き続き、ゲームの裏方部分を作っていきます。前回の状態だと色々とエラーが出てしまっていると思うので、今回はいくつかのスクリプトを変更してゲームがきちんと動くように修正します。
変更するスクリプトは次の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のほうで用意した配列を操作するためのメソッドを用意したり、ステージ数分だけ配列の要素を生成する処理を追加したりしました。
これでゲームの裏方部分が一通りできました。ゲームを実行してちゃんと動くかどうかを確かめてみましょう。
次のページ→タイトル画面とステージ選択画面の作り方
