しっぽを追いかけて

ぐるぐるしながら考えています

Unity と猫の話題が中心   掲載内容は個人の私見であり、所属組織の見解ではありません

Unity で MemoryPack for C# でデータをファイル保存する

※ これは 2022/12/09 時点の Unity 2022.2.0f1 MemoryPack for C# v1.8.12 の情報です

最新版では動作が異なる可能性がありますのでご注意ください

前回 MemoryPack for C# で、コード生成が不要になったようだったけど IL2CPP ビルドで実機確認したわけではないので試してみたい

github.com

実機で確認できるようにファイル保存して読み込んだ内容を画面表示する

例によって Test.cs を下記のように変更

using System;
using System.IO;
using System.Security;
using System.Threading.Tasks;
using MemoryPack;
using TMPro;
using UnityEngine;

public class Test : MonoBehaviour
{
    [SerializeField]
    private TextMeshProUGUI logText = null;

    public void Awake()
    {
        // シリアライザの初期設定
        // いらない!
    }

    public async void Start()
    {
        // シリアライズしたものをデシリアライズしてみる
        var data = new SaveData(1, "ラグドールもふもふ巨大ねこ");
        var filePath = Path.Combine(Application.persistentDataPath, "save.dat");

        // ファイル入出力
        await SaveAsync(filePath, data);
        var loadData = await LoadAsync(filePath);

        this.logText.text = $"Id={loadData.Id}\nMessage={loadData.Message}";
    }

    /// <summary>
    /// ファイル保存
    /// </summary>
    /// <param name="filePath">保存先ファイルパス</param>
    /// <param name="data">保存データ</param>
    /// <returns>保存できたかどうか</returns>
    public static async Task<bool> SaveAsync(string filePath, SaveData data)
    {
        try
        {
            using (var stream = new FileStream(filePath, FileMode.Create, FileAccess.Write))
                await MemoryPackSerializer.SerializeAsync(stream, data);
            return true;
        }
        catch (IOException) { }
        catch (UnauthorizedAccessException) { }
        catch (SecurityException) { }

        return false;
    }

    /// <summary>
    /// ファイル読み込み
    /// </summary>
    /// <param name="filePath">読み込み元ファイルパス</param>
    /// <returns>読み込みデータ</returns>
    public static  async Task<SaveData> LoadAsync(string filePath)
    {
        if (!File.Exists(filePath))
        {
            return new SaveData();
        }
        try
        {
            using (var stream = new FileStream(filePath, FileMode.Open, FileAccess.Read))
                return await MemoryPackSerializer.DeserializeAsync<SaveData>(stream);
        }
        catch (IOException) { }
        catch (UnauthorizedAccessException) { }
        catch (SecurityException) { }

        return default;
    }
}

ファイルの読み書きメソッドを追加し、テキストの UI に読み込んだ内容を表示するだけ

シーンの方はこんな感じに画面全体に Text Mesh Pro UGUI を置いて、Test.cs の Log Text にアタッチしておく

Text Mesh Pro UGUI の日本語フォントの設定は割愛

TextMeshPro の UI を Test コンポーネントにアタッチ

これで試しに Android IL2CPP ビルドして実機で確認してみると・・・

文字化けなし

文字化けもなくしっかり復号化できた

やはりコード生成は自動だ!シリアライザの初期設定も不要!