Unityで脱出ゲームのオートセーブ機能を作ってみたので紹介します。
目次
ScriptableObjectを使ってセーブする
脱出ゲームでセーブする対象は以下の通り。
- アイテムボックスのアイテム
- フィールドに存在するアイテム
- 移動した家具の位置
この3つを保存するためにScriptableObjectを使います。
using UnityEngine; [CreateAssetMenu(fileName ="game_data")] public class GameData : ScriptableObject { //アイテムボックス内のアイテム public Item[] items; //GameObjectの存在フラグ public bool[] flag; //移動した家具のデータを保存する public MovableObj[] param; }
ItemクラスとMovableObjクラスはシリアライズ可能な独自クラスです。(中身の詳細は省きます。)
作成したゲームデータは以下のように宣言することでスクリプト内で利用できるようになります。
public GameData gameData;
アイテムボックスのアイテム
アイテムボックスにあるアイテムを取ってきて保存します。
//アイテムボックスのセーブ for (var i = 0; i < 5; i++) { gameData.items[i] = ItemBox.instance.getSlotItem(i); }
フィールドに存在するアイテム
フィールド上のアイテムはSetActiveを使って表示、非表示を切り替えていますので、Bool型のactiveSelfを保存することでアイテムの状態を保存することができます。
public GameObject[] gameobj;
対象となるGameObjectを上記のように宣言して、インスペクタから保存したいGameObjectをドラッグしてセットします。
保存するタイミングで以下を実行すれば、実行時点でのアイテムGameObjectのアクティブ状態(activeSelf)を保存できます。
取得前ならTrue,取得済みならFalseになっているはずです。
//アイテムの存在をセーブ for(var i = 0; i < gameobj.Length; i++) { gameData.flag[i] = gameobj[i].activeSelf; }
移動した家具の位置
ScriptableObjectはTransformを保存できません。
位置情報はVecter3、回転情報はQuaternionを使います。
[Serializable] public class MovableObj { //移動済みかどうかのフラグ public bool isMove; //位置を保存する public Vector3 position; //角度を保存する public Quaternion rotation; public MovableObj(bool isMove,Vector3 position,Quaternion rotation) { this.isMove = isMove; this.position = position; this.rotation = rotation; } }
【Serializable】を付けることで、カスタムクラスを保存することが可能になります。
保存する時は以下の通り。
public GameObject[] moveobj;
//家具の位置をセーブ for(var i = 0; i < moveobj.Length; i++) { gameData.param[i].isMove = dict[moveobj[i].name]; gameData.param[i].position = moveobj[i].transform.position; gameData.param[i].rotation = moveobj[i].transform.rotation; }
こんな感じ。
おわり。