前回の記事でゲームオーバーとゲームクリア処理を作成しました。
前回の記事:
2DRPGの作り方24 ゲームオーバー処理とゲームクリア処理を実装する
前回の記事でボス戦を実装し、いよいよRPGゲームとして欠かせない要素の大部分が仕上がってきました。前回の記事:ですが、まだゲーム完成まではもう少しやることが残っています。ゲームの流れを制御する部分ですね。今回の記事ではゲームの終着地点である...
今回の記事ではUnityのPlayerPrefsとjsonデータ構造を用いてセーブシステムを作成していきます。
また、宝箱とボスの配置状況も記録し、前回のゲームオーバー処理の際に宝箱を何度も取得できるといった状態が起こらないように実装します。
セーブ用のクラスを作成する
それではまずセーブ機能を管理するクラスを作成していきます。
新しく「SaveData.cs」というスクリプトを作成してください。保存先はお好みでOKですが、記事ではAssets > Scriptsフォルダーに保存しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
// SaveData.cs SaveDataコンポーネントの実装 using System.Collections; using System.Collections.Generic; using UnityEngine; public class SaveData : MonoBehaviour { [SerializeField] List<Map> _maps; public void Save(RPGSceneManager manager) { PlayerPrefs.SetString("player", JsonUtility.ToJson(manager.Player.GetSaveData())); var mapName = manager.ActiveMap.name; mapName = mapName.Replace("(Clone)", ""); PlayerPrefs.SetString("activeMap", mapName); var instantMapData = manager.ActiveMap.GetInstantSaveData(); PlayerPrefs.SetString("instantMapData", JsonUtility.ToJson(instantMapData)); var activeMapKey = $"map_{manager.ActiveMap.name.Replace("(Clone)", "")}"; foreach (var map in _maps) { var key = $"map_{map.name.Replace("(Clone)", "")}"; if(key == activeMapKey) { Save(manager.ActiveMap); } else { SaveWithTemporary(map); } } } void Save(Map map) { var key = $"map_{map.name.Replace("(Clone)", "")}"; PlayerPrefs.SetString(key, JsonUtility.ToJson(map.GetSaveData())); } void SaveWithTemporary(Map map) { var key = $"map_{map.name.Replace("(Clone)", "")}"; var tempKey = "temp_" + key; if(PlayerPrefs.HasKey(tempKey)) { PlayerPrefs.SetString(key, PlayerPrefs.GetString(tempKey)); PlayerPrefs.DeleteKey(tempKey); } } public void SaveTemporary(Map map) { var saveData = map.GetSaveData(); PlayerPrefs.SetString($"temp_map_{map.name.Replace("(Clone)", "")}", JsonUtility.ToJson(saveData)); } } |
「SaveData」コンポーネントでは次のものを保存しています。
- プレイヤーのパラメータ
- 現在のマップとプレイヤーやNPCの位置
- 宝箱を開けたかどうか(マップ単位)
- ボスの撃破状況
などなど。
「SaveData」コンポーネントではまだ実装していない他のクラスのメンバがあるので次はそちらを実装していきましょう。
「Map」スクリプトを次のように修正してください。
まとめ
今回の記事ではセーブコマンドを作成しました。
セーブするだけだと処理としてはまだ不完全なので次はロード処理を作成していきます。
今回の内容を簡単にまとめると以下のようになります。
- セーブ用のクラスを作成
- メニューにセーブコマンドを追加
それでは次の記事に行ってみましょう!
2DRPGの作り方26 セーブデータをロードしてロールプレイングゲーム進行状況を復元
前回の記事ではセーブ機能を追加しました。前回の記事:今回の記事ではセーブしたデータをロードできるようにしていきます。また、宝箱を取得した後にゲームオーバーになってしまった場合、一度取得した宝箱を何度でも取得できる不具合もここで調整していきま...
コメント