セーブについては前回やった。
タイトル画面でロードしてシーンを切り替える、というのをやってみる。
つまりタイトル画面でデータをロードして、他のシーンに値を引き渡す、という事をやるメモ。
こことか見ながらやってみる。
GUI
シーンの切り替えをやるには複数のシーンが必要なのでとりあえず作成する。
メニュー画面の作りについてはここ辺りが詳しそうだけど、
とりあえずお試しなのでUIは普通のボタンを配置
なのと、UIでも新しいInputSystemを使ってみたい(上の例だとUIとインプット連携させずに自前処理してるぽい)
単純な操作の場合はEvenSystemを配置するとキーでの自動選択が効くので、ボタンの選択は出来た。Replaceボタンを押すと新しいInputSystemを利用するようになる。
あとは実際に選択された時の挙動をスクリプトで書けば良い。
空のオブジェクトを作って、Managerスクリプトを作成。
シーン間のデータをグローバルを使わずに渡す方法はここにあったので従って作成。テストということで、面倒なので同じスクリプトを別シーンのPlayerにセットして使う事にした。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityStandardAssets._2D;
public class GameManager : MonoBehaviour {
public Vector3 pos;
public void StartGame() {
SceneManager.LoadScene("SampleScene");
}
public void LoadGame() {
SaveManager saveManager = new SaveManager();
string SaveDirPath = Application.persistentDataPath;
SaveData sdata = saveManager.DataLoad(SaveDirPath, "test.sv");
if (sdata != null) {
SceneManager.sceneLoaded += GameSceneLoaded;
pos = new Vector3(sdata.x, sdata.y, sdata.z);
}
SceneManager.LoadScene("SampleScene");
}
private void GameSceneLoaded(Scene next, LoadSceneMode mode) {
var gameManager = GameObject.FindWithTag("Player").GetComponent<GameManager>();
// データを渡す処理
gameManager.pos = pos;
gameManager.LoadedValsSet();
SceneManager.sceneLoaded -= GameSceneLoaded;
}
private void LoadedValsSet() {
this.transform.position = pos;
}
}
タイトル画面ではボタンにMangarをアタッチした上で、クリック時に自分自身を持ってきて関数選択。
遷移先シーンでは、Playerタグを付けて、このManagerスクリプトをセット。
これでロードしてデータ(セーブしたプレーヤーの位置)を引き渡すことが出来た。