ココのコイン落としでは、コインの各位置状態は保存せず(毎回初期位置に戻る)、各アイテム保持数と、コイン枚数、石の数、スロット回転数、大当たり回数、キック力、キックエネルギー、欄干スキル回数、押出スキル回数、プレイ時間を保存しています。プレイ時にはこれらのステータスはScriptableObject型を継承したStatusクラスでまとめて管理しており、プレイ時に状態が変わる度に自動セーブしています。
具体的に見ていくと、PlayerPrefs.SetInt(key,value)でアイテム保持数、コイン枚数、石の数、スロット回転数、大当たり回数、キックエネルギー、欄干スキル回数、押出スキル回数、プレイ時間(秒)を記録し、
PlayerPrefs.SetFloat(key,value) でキック力(float。別に整数型でも良かったのですが)を記録しており、状態が変わる度にSetInt()あるいはSetFloat()しています(オートセーブ)。実際のセーブはアプリ終了時にUnityが自動で行いますが、クラッシュの可能性もあるのでPlayerPrefs.Save()で明示的に画面切り替え時などの要所でセーブしてあげます。
アイテム保持数データはアイテム取得済みフラグも兼ねています。まず、最初から全てのアイテムについて保有数0とするデータを保存するのではなく、アイテムを手に入れる度にkeyを追加していきます。アイテム保持数はStatusクラスではDictionary<String,Int>itemNumと宣言しており、セーブ時にはPlayerPrefs.SetInt(Item.GetItemCodeName(),Status.itemNum[
Item.GetItemCodeName() ]という形でセーブしています。
Resources.LoadAll()でresoueces以下のitemフォルダに保存したScriptableObjectを継承したItem型(他記事参考)のアイテムを全て読み込み、
辞書itemNumと比較する事でアイテム収集率を計算できます。このやり方だとアイテム保持数に加え「一度は取得したアイテム」フラグを加える必要もないし、アイテムを後から追加しても特にいじる部分が無くなるので便利です。
プレイ時間の経過は、Time.deltaTimeを加算した一時変数bufTimeを一定経過おきにStatus.playTimeに加え、bufTimeをリセットする形で実装しています。
データをロードするときはまずゲーム開始時の初期値を保存したStatus型オブジェクトのdefaultStatusの値をplayingStatusの値に上書きします。更に
PlayerPrefs.GetInt(),
PlayerPrefs.GetFloat() を使いplyaingStatusの変数に上書きしていきます。アイテム保持数をStatus.itemNumに保存する時は、
Resources.LoadAll()でresoueces以下のitemフォルダに保存したアイテムを全て読み込み、 PlayerPrefs.HasKey(item.GetItemCodeName()) で セーブデータ内の有無をチェックし、itemNumに上書きあるいは追加していきます。
コメント