以下の内容はhttps://cres-tech.hatenablog.com/entry/2019/07/15/232719より取得しました。


【Unity】端末内のファイル扱う方法

主にスマホ向けアプリを開発していると使うことがないのが、ファイルを書き出す機能です。
プレイヤーデータなどは、ほぼサーバー側にありますからね。

ぶっちゃけ僕も最近まで知りませんでした。

今回、サークルのゲーム開発で端末内のセーブデータを保存することになりましたので、記事にしておきます。

まず、今回はjsonで保存するのでセーブデータのオブジェクトを作成しておきます。
クラスに[Serializable]をつけておかないとシリアライズ出来ないので注意。

using System;

[Serializable]
public class SaveStruct
{
    public string id;
    public string chara_id;
    public string chara_data;
    public string date;
}


次に保存や読み出し用のクラスを作ります。
恥ずかしながら今回、ファイル書き込み・読み込みに初めてusingを使いました。
普通に開いてもいいのですが、ファイルのクローズをガベージコレクション任せにすると、不慮の書き込みが発生するみたいです。


docs.microsoft.com


まあ都度クローズすればいいのですが、例外の対処なども含めると若干めんどくさいので、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ゲームとなっております。シナリオも僕が書いたので、興味のある方はぜひ見てみてください。
トップバナーをクリックで詳細が見られます。

crescendo-works.web.app


このサイトも作るの大変だったなぁ・・・ココらへんの話は後日やろう。




以上の内容はhttps://cres-tech.hatenablog.com/entry/2019/07/15/232719より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14