はじめに
UnityでMasterMemoryを使用して、スプレットシートや自前で作成したJsonのマスターデータをMasterMemoryで使えるようにしたサンプルプロジェクトを作成しました。
提供するプロジェクトを元にご説明します。
プロジェクト: https://github.com/KensukeStudent/MasterMemoryTest
MasterMemoryとは
既に多くの方がご存じだと思いますが、
・省メモリ
・高速なロード(初期化を含む)
・高速な検索
が可能となるありがたいプラグインです。
また、個人開発者にとってはマスターデータ管理クラス関連は全てお任せできる点も非常に便利であると感じています。
本題
dotnet 事前準備
- MasterMemoryとMessagePack(MasterMemoryの基盤)のダウンロード
MasterMemory: MasterMemory.Unity.2.4.4.unitypackage
MessagePack: MessagePack.Unity.unitypackage_v2.5.140
2. dotnetインストール 本編は自動生成時にdotnetコマンドを使用しますので、以下をインストール
以下のコマンドを叩きdotnetを持っていなければインストールしてください。
本編はdotnet v8.0
dotnet --version
ターミナルを持っていない方は、SourcesTreeのターミナルからでもよいです。
余談ですが、本編ではシェルとしてbashを使用しますので専用のインストールが面倒な方はSourcesTreeのターミナルが良いと思います。
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
読み込みデータ準備
- データ関連の準備
Jsonデータとクラスを準備
・Resources/Masterディレクトリ以下に読み込みたいJsonを配置
・Scripts/Masterディレクトリ以下にJsonから読み込みたいクラスを作成
※ 変数名は一致させること
今回は以下のデータを用意しています。
[
{
"Id": 1,
"Name": "ひとかげ",
"Attack": 10
},
{
"Id": 2,
"Name": "ふしぎだね",
"Attack": 15
},
{
"Id": 3,
"Name": "ぜにがめ",
"Attack": 20
}
]
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ディレクトリに入っている前提のコマンドです。
sh Tools/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
読み込み用バイナリの作成
1. Masterクラスの登録
BinaryGenerator.csの定義に追加する
// DatabaseBuilderを使ってバイナリデータを生成する
var databaseBuilder = new DatabaseBuilder();
databaseBuilder.Append(FileLoad.JsonLoad<CharacterMaster>());
var binary = databaseBuilder.Build();
2. MasterMemory読み込みのためのバイナリデータ作成
Unity>Tools/Master/GenerateBinaryをクリック
実行することでResources/BinaryディレクトリにMasterBytesファイルが生成されていると思います。
実行結果の確認
- 定義を追加
自動生成したマスター管理クラスにアクセスを行う
// MemoryDatabaseをバイナリから作成
var memoryDatabase = new MemoryDatabase(binary);
// テーブルからデータを検索
var character = memoryDatabase.CharacterMasterTable.FindById(1);
Debug.Log($"キャラ名 : {character.Name}");
2. 読み込み確認
Unity>Tools>Master/LoadBinaryをクリックするとConsoleに登録したデータが表示されることが確認できると思います。
さいごに
いかがだったでしょうか?
データをJsonで取り扱うことが当たり前になっている現状、MasterMemoryを使用するだけでJsonで読み込んだデータを簡単に管理してくれるプラグインは非常に開発の助けになりますね!