セーブのバージョン

できればやらないことにこしたことはないのですが、セーブをバージョンアップしなければならないことがあります。
古いバージョンのセーブに含まれているパラメータを新しいバージョンのセーブでは以前と別の意味で使いたいといった特別なときのみ対応が必要になります。このような時でも容量を無駄にしても良いなら、新しくパラメータを増やして保存した方が安全です。
デバッグ用途でなければ、バージョンは増える方向にしかいきません。バージョン1、2があったら、1から2へはいけますが逆はいけません。

対応方法は色々あると思います。今、私が使っている方法は次のような方法です。
セーブにはバージョン情報(単なる数字int)を保存できるようにします。またプログラム中にセーブのバージョンを定義します。プログラム中に書いたバージョンが最新バージョンになります。プログラムにあるロード処理は当然最新バージョンのデータに対応したものになっています。
バージョンが変わるごとに1つバージョンを上げる処理を作り、それを順に通すことにより古いバージョンのセーブから最新のバージョンのセーブを作りだします。

バージョン3が最新のものとし、セーブされているのがバージョン1とします。
バージョン2を作ったときに、バージョン1のセーブからバージョン2のセーブを作る処理Convert1To2を作ります。Convert1To2はバージョン1をロードして、2のデータを作り、2として保存します。PlayerPrefsで作ると、バージョン1のキーで必要な情報を変数に保持しておき、バージョン2のキーで作成したデータを保存することになります。
同じ要領でバージョン2のセーブからバージョン3のセーブを作る処理Convert2To3を作ります。これらの変換関数は現在のセーブバージョンを見て変換を行い、処理の最後でバージョンを上げます。

  1. 保存されているバージョンを調べる
  2. バージョンが最新でなかったら、バージョンを1つずつ上げていくための処理を行う
  3. 最新バージョンのデータが保存されている状態になったら、ロードを行う

という手順でバージョンがなんでも対応できます。この方法は古いバージョンのものがあったら、それを逐次新しいバージョンのデータに変換していくというものです。ひとつずつバージョンが上がるためにいくつものバージョンが合っても正しく変換でき、バージョンが上がるときの対応も1つ前のものから最新のバージョンへの変換処理だけ追加すれば良いという利点があります。

ややこしく感じるのはセーブがファイル上にあるのかメモリ上にあるのかが、文章からだと区別しにくいからです。 説明していて私もちょっと混乱してきました。