主にスマホ向けアプリを開発していると使うことがないのが、ファイルを書き出す機能です。
プレイヤーデータなどは、ほぼサーバー側にありますからね。
ぶっちゃけ僕も最近まで知りませんでした。
今回、サークルのゲーム開発で端末内のセーブデータを保存することになりましたので、記事にしておきます。
まず、今回はjsonで保存するのでセーブデータのオブジェクトを作成しておきます。
クラスに[Serializable]をつけておかないとシリアライズ出来ないので注意。
using System;
[Serializable]
public class SaveStruct
{
public string id;
public string chara_id;
public string chara_data;
public string date;
}
次に保存や読み出し用のクラスを作ります。
恥ずかしながら今回、ファイル書き込み・読み込みに初めてusingを使いました。
普通に開いてもいいのですが、ファイルのクローズをガベージコレクション任せにすると、不慮の書き込みが発生するみたいです。
まあ都度クローズすればいいのですが、例外の対処なども含めると若干めんどくさいので、useを使うのが確実かつシンプルです。
use (IDisposableオブジェクト)
{
//処理
}
最終的に以下のようなソースになりました。
メソッドのネーミングセンスがないのをどうにかしたい(
using System;
using UnityEngine;
using System.IO;
public static class SaveManager
{
public static void setSaveData(string save_id, string chara_id, string chara_data, string )
{
var save_obj = new SaveStruct
{
id = save_id,
chara_id = chara_id,
chara_data = chara_data,
date = DateTime.Now.ToString("yyyy年MM月dd日hh時mm分")
};
string jsonString = JsonUtility.ToJson(save_obj);
using(var file = new FileStream(
Application.persistentDataPath + save_id + "save.json",
FileMode.Create, FileAccess.Write))
{
byte[] bytes = System.Text.Encoding.UTF8.GetBytes(jsonString);
file.Write(bytes, 0, bytes.Length);
}
}
public static SaveStruct getSaveData(string save_id)
{
using(var file = new FileStream(
Application.persistentDataPath + save_id + "save.json",
FileMode.Open, FileAccess.Read))
{
byte[] bytes = new byte[file.Length];
file.Read(bytes, 0, bytes.Length);
string jsonString = System.Text.Encoding.UTF8.GetString(bytes);
SaveStruct save_obj = JsonUtility.FromJson<SaveStruct>(jsonString);
return save_obj;
}
}
public static bool CheckSaveFile(string file_no)
{
if (File.Exists(Application.persistentDataPath + file_no + "save.json") == true)
{
return true;
}
else
{
return false;
}
}
}
setSaveDataで渡されたID名をつけて保存。dateには保存した日付をタイムスタンプ代わりにいれています。
getSaveDataで読み込みをしてますね。
これだけだとファイルがあるかないかが分からないので、CheckSaveFileでファイルの存在チェックをしてます。
もっといい感じに作れるかもしれませんが、今回は特に複雑な事をするわけでもないので、これでいきます。
最近はスクリプト言語ばかりなのですが、コンパイル言語もちょくちょくやらないと衰える感じがしますねー。やっぱり。
ゲームの宣伝
ということでここで宣伝をば。
僕が運営してるサークル、CRESCENDOworksの処女作、infeteriusがリリース予定です。
時期は夏予定だけど、たぶん秋になります。
純粋にシナリオを楽しむADVゲームとなっております。シナリオも僕が書いたので、興味のある方はぜひ見てみてください。
トップバナーをクリックで詳細が見られます。
このサイトも作るの大変だったなぁ・・・ココらへんの話は後日やろう。