あさちゅんのゲームブログ

UnityやSiv3Dに関するゲーム開発メモを残していきます

Siv3Dの機能をフル活用してセーブデータを実装する

前回はCSVファイルを使ってセーブデータを作りましたが、あれだと中身が簡単に見えちゃうし、どこにどのデータが覚えておかないといけないのでミスってフラグを間違えそうです。

という訳でもうちっとまともなセーブデータを作りました!GitHubにあるので良ければ使ってやってください。

それでは中身の紹介と行きたいと思います

いろいろな型を文字列で管理する

いろいろな型を扱うのを今回は文字列で管理しようと思います。データのキーを指定してそれに対応する文字列を型に変換してから返す寸法です。

まず、文字列に変換するのはおなじみFormat関数に突っ込めば終了です。簡単です、さすがFormat関数です。

逆に文字列から各データ型に変換するのはParse関数を使用します。この関数は文字列で指定した値をデータ型に変換して返してくれます。変換に失敗した時の挙動によってParse関数、ParseOr関数、ParseOpt関数を使い分けます。使い分けはCSVReaderなどのget関数と同じです。

データを暗号化して読み書きする

セーブの際にすべての内部データを任意の区切り文字で区切ってすべて結合します。あとはこれを保存すればセーブ機能の完成です。しかしこのままでは中身が簡単にばれてしまいます。
そこでCrypto::EncryptString関数を使ってAESによる暗号をかけます。戻り値にMemoryReader型が返って来るのでsave関数を呼ぶことでバイナリファイルで保存できます。

Play Siv3D!
暗号化

次はロード機能を実装します。ファイルはバイナリファイルで保存しているのでBinaryReaderを使って読み込みます。復号にはCrypto::DecryptString関数を使用するのですが、これには復号するデータをMemoryReaderで渡す必要があります。そこでBinaryReaderのreadWhole関数を使用して読み込んだファイルをMemoryReaderに変換します。これで暗号をかける前の区切り文字で区切られたデータが手に入ります。

あとはこれを区切ればいいだけです。文字列の頭の文字が必ず区切り文字なのでStringのsplit関数を使うことでstd::vectorで区切った内容が得られます。先頭が必ず区切り文字って暗号的にはよくない気もしますが、そこまでしてくれるならどうぞチートしてくださいってことにして置きます、、、

まとめ

ParseにCrypto、BinaryReader、split関数とSiv3Dの便利機能をいろいろ組み合わせてセーブデータを実装してみました。まだまだもろいですが個人的にはこんなんでも十分かなと思います。Siv3Dは探せばいろんな機能があるので何か実装する前にPlay Siv3D!を漁るのも悪くないかもしれません。

使用したソフト
Windows8.1
Siv3D(June2015v2)