【Unity×MasterMemory】簡単♪マスターデータ管理クラス

# はじめに
UnityでMasterMemoryを使用して、スプレットシートや自前で作成したJsonのマスターデータをMasterMemoryで使えるようにしたサンプルプロジェクトを作成しました。

提供するプロジェクトを元にご説明します。
プロジェクト: https://github.com/KensukeStudent/MasterMemoryTest

#### MasterMemoryとは
既に多くの方がご存じだと思いますが、
・省メモリ
・高速なロード(初期化を含む）
・高速な検索
が可能となるありがたいプラグインです。

また、個人開発者にとってはマスターデータ管理クラス関連は全てお任せできる点も非常に便利であると感じています。

# 本題

#### dotnet 事前準備

1. MasterMemoryとMessagePack(MasterMemoryの基盤)のダウンロード
MasterMemory: [MasterMemory.Unity.2.4.4.unitypackage](https://github.com/Cysharp/MasterMemory/releases/download/2.4.4/MasterMemory.Unity.2.4.4.unitypackage)
MessagePack: [MessagePack.Unity.unitypackage_v2.5.140](https://github.com/MessagePack-CSharp/MessagePack-CSharp/releases/download/v2.5.140/MessagePack.Unity.unitypackage)
<p>
2. dotnetインストール
本編は自動生成時にdotnetコマンドを使用しますので、以下をインストール

以下のコマンドを叩きdotnetを持っていなければインストールしてください。
本編はdotnet v8.0
```
dotnet --version
```
[dotnet install](https://dotnet.microsoft.com/en-us/download)

ターミナルを持っていない方は、SourcesTreeのターミナルからでもよいです。
余談ですが、本編ではシェルとしてbashを使用しますので専用のインストールが面倒な方はSourcesTreeのターミナルが良いと思います。
<p>
3. ジェネレータをインストール

dotnetをインストールしたら、以下のコマンドでMasterMemoryとMessagePackのジェネレータをそれぞれインストール
```
dotnet tool install --global MasterMemory.Generator
dotnet tool install --global MessagePack.Generator
```

インストール後に以下のコマンドを叩きバージョンなど表示されていればよいです。
```
dotnet tool list --global

パッケージ ID                    バージョン        コマンド        
-----------------------------------------------------
mastermemory.generator      2.4.4        dotnet-mmgen
messagepack.generator       2.5.140      mpc
```

#### 読み込みデータ準備
1. データ関連の準備

Jsonデータとクラスを準備
・Resources/Masterディレクトリ以下に読み込みたいJsonを配置
・Scripts/Masterディレクトリ以下にJsonから読み込みたいクラスを作成
※ 変数名は一致させること

今回は以下のデータを用意しています。
``` CharacterMaster.json
[
    {
        "Id": 1,
        "Name": "ひとかげ",
        "Attack": 10
    },
    {
        "Id": 2,
        "Name": "ふしぎだね",
        "Attack": 15
    },
    {
        "Id": 3,
        "Name": "ぜにがめ",
        "Attack": 20
    }
]
```
``` CharacterMaster.c#
using MessagePack;
using MasterMemory;

[MemoryTable("character"), MessagePackObject(true)]
public class CharacterMaster
{
    // PrimaryKeyのアトリビュートは固有なidにつける
    [PrimaryKey]
    public int Id { get; }

    public string Name { get; }

    public int Attack { get; }

    // コンストラクターはコマンドで自動生成するため定義不要
}
```

#### 自動生成コマンド実行

MasterMemory_bash.shの起動のためシェルコマンドを実行します。
SourcesTreeのターミナル(bash)を起動します。
尚、以下のコマンドはMasterMemoryTestディレクトリに入っている前提のコマンドです。
``` MasterMemory_bash.sh
sh Tools/MasterMemory_bash.sh
```
※ 読み込み先のディレクトリなど変更したい場合はMasterMemory_bash.shに変更を加える必要があります！

```MasterMemory_bash.sh
echo_run()
{
    # 黄色カラーでログ出力
    echo -e "\e[33m $1 \e[m"
}

CURRENT_DIR=$(cd $(dirname $0);pwd) # スクリプトのディレクトリ取得
PARENT_DIR=$(cd "$(dirname "$CURRENT_DIR")" && pwd) # 一つ上のディレクトリ取得
MASTER_DIR=$PARENT_DIR/Assets/Scripts/Master/
GENERATED_DIR=$PARENT_DIR/Assets/Scripts/Generated/
NAMESPACE="Example"

# エラーが発生したら即終了
set -e
echo_run マスターメモリ関連のデータ作成中....

# マスターメモリ関連のデータ作成
dotnet-mmgen.exe -i $MASTER_DIR -o $GENERATED_DIR -n "Example" -addImmutableConstructor

echo_run "\nメッセージパック関連のデータ作成中...."

# メッセージパック関連のデータ作成
mpc -i $MASTER_DIR -o $GENERATED_DIR

echo_run =====実行完了=====
set +e
```

#### 読み込み用バイナリの作成

<p>
1. Masterクラスの登録

BinaryGenerator.csの定義に追加する

``` BinaryGenerator.c#
    // DatabaseBuilderを使ってバイナリデータを生成する
    var databaseBuilder = new DatabaseBuilder();
    databaseBuilder.Append(FileLoad.JsonLoad<CharacterMaster>());
    var binary = databaseBuilder.Build();
```
<p>
2. MasterMemory読み込みのためのバイナリデータ作成

Unity>Tools/Master/GenerateBinaryをクリック
![スクリーンショット 2024-01-28 162754.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3128572/fa711ceb-d029-e6db-2d64-b9384c6ae173.png)

実行することでResources/BinaryディレクトリにMasterBytesファイルが生成されていると思います。

#### 実行結果の確認

1. 定義を追加

自動生成したマスター管理クラスにアクセスを行う
``` BinaryLoader.cs
    // MemoryDatabaseをバイナリから作成
    var memoryDatabase = new MemoryDatabase(binary);

    // テーブルからデータを検索
    var character = memoryDatabase.CharacterMasterTable.FindById(1);
    Debug.Log($"キャラ名 : {character.Name}");
```
<p>
2. 読み込み確認

Unity>Tools>Master/LoadBinaryをクリックするとConsoleに登録したデータが表示されることが確認できると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3128572/218ad9d6-ba0c-298f-7234-fc8e78387073.png)

# さいごに

いかがだったでしょうか？
データをJsonで取り扱うことが当たり前になっている現状、MasterMemoryを使用するだけでJsonで読み込んだデータを簡単に管理してくれるプラグインは非常に開発の助けになりますね！

https://light11.hatenadiary.com/entry/2023/11/20/194245

https://yotiky.hatenablog.com/entry/unity_messagepackforcsharp

https://github.com/KensukeStudent/MasterMemoryTest