ゲームの裏方部分の作り方(Part2:各種スクリプトの変更)

前回に引き続き、ゲームの裏方部分を作っていきます。前回の状態だと色々とエラーが出てしまっていると思うので、今回はいくつかのスクリプトを変更してゲームがきちんと動くように修正します。

変更するスクリプトは次の4つです。

  1. PlayerController
  2. MoveSceneManager
  3. SaveData
  4. 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のほうで用意した配列を操作するためのメソッドを用意したり、ステージ数分だけ配列の要素を生成する処理を追加したりしました。

これでゲームの裏方部分が一通りできました。ゲームを実行してちゃんと動くかどうかを確かめてみましょう。


次のページ→タイトル画面とステージ選択画面の作り方