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

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

Siv3Dでセーブデータ的なサムシングを作る

最近FEifをやっているのですが、敵が強くて強くてすぐ仲間がやられてしまいます。クラシックなんでその度にリセット!まぁ、だからこそ面白いとは思うんですが、、、

ってことで今回はリセットことセーブデータをSiv3Dで作って見ようと思います。

CSVファイルを扱う

セーブデータと言っても結局は外部ファイルに過ぎません。ということで今回は扱いが簡単でいろんなデータを詰め込めるCSVファイルで実装しようと思います。例のごとくSiv3D側で簡単に扱えるようにしてくれています

Play Siv3D!
CSV ファイル

まずはセーブデータのファイルパスを指定します。ファイルパスはexeファイルというかengineフォルダと同じ場所から見た相対パスなので今回は同じフォルダの"Savedata.csv"を開こうとしてみます。

初回プレイだったり、セーブデータが削除されていた場合開くことができないので、新しくファイルを作ってやります。と言ってもCSVWriterを作って打ち込みたいデータを引数に入れればOKです。整数から文字列、Vec2までそのまま突っ込むだけで書き込むことができます。Print関数で表示できるものなら大丈夫です。最後に作ったファイルをもう一回CSVReaderで開こうと試みます。

値を取り出すのも簡単で取り出したい型と何行何列目にあるかを指定するだけです。こんな感じにゲーム開始時にCSVファイルを読み込み値を格納して、セーブする時には書き出してやれば簡単なセーブ機能の出来上がりです。

値がなかった時の処理

CSVファイル自体はあったけど壊れていたり、変に編集されたりすると指定した箇所に値がなかったりします。CSVReaderから値を取り出す時は値がなかった時の処理によって使う関数が変わってきます。

1つ目のget関数は失敗した場合デフォルトの値が返ってきます。失敗した場合何が入ってるかわかったもんじゃないってことです。それに対し、2つ目のgetOr関数は失敗した時に返す値を引数で指定することができます。

最後のgetOpt関数は戻り値がそのままの型ではなくOptionalに包まれた型が出てきます。Optionalは値がある場合はvalueから値を取れますがない時はnoneが返って来るという型です。

これら3つを駆使すれば値がなかった時も不具合なくゲームを開始できます。

特殊フォルダの取得

このままだと、ユーザーの目に見えるところにセーブデータがあるので見栄えが悪いですし、ユーザーの設定によってはうまく書き込めない場合があります。そこで Windowsが用意している特殊フォルダを利用します。

「shlobj.h」をインクルードすると使えるSHGetSpecialFolderPath関数によって特殊フォルダが取得出来ます。引数の意味は左から、ウィンドウハンドル、取得した特殊フォルダのパス、取得する特殊フォルダの種類、なかった時に作るかどうか。戻り値自体は取得に成功したかを返してくれます。今回の場合はゲームのセーブデータなどを入れられるAppDataというフォルダを取得しています。

この特殊フォルダには他のアプリのデータも入っているので、ここに直接セーブデータを作るのではなくフォルダとかに入れた方が親切です。今回はAsabloフォルダの中に作りました。SHGetSpecialFolderPath関数はSiv3Dの機能ではないのでwchar_t型の配列に入っていてそのままでは扱えませんが、Siv3Dあるある文字で困ったときはFormat関数に突っ込むで解決します。

また勝手に人のパソコンにフォルダを作ったので消せる機能も作っておきましょう。FileSystem::Remove関数で削除できます。ファイルではなくフォルダごと消したいのでFileSystem::ParentPath関数でフォルダのパスを取得できます。

まとめ

とまぁ、こんな感じにかなり基本の基本なセーブデータの作り方を紹介しましたが、ゲームもセーブデータがあれば一気にそれっぽくなったかなと思いいます。せっかくゲームなんだしハイスコアややりこみ要素はやっぱほしいですね!

最後にいつものコピペでできるSiv3D置いときます~

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