前回、ゲームで用いる数値データを管理する手段として一般的な、バイナリデータを構造体配列にマッピングする手法について解説しました。今回からは、FlatBuffersというフレームワークを使って、Unity(C#)上でシリアライズ/デシリアライズ処理を実装していきます。
FlatBuffers
FlatBuffersはGoogleが2014年に発表したシリアライズフォーマットです。
FlatBuffers(公式)
https://google.github.io/flatbuffers/
FlatBuffers - Wikipedia(日本語ページはありません)
https://en.wikipedia.org/wiki/FlatBuffers
当初よりゲーム開発を想定して設計された物で、メモリ効率や実行速度に優れています。また、ゲーム開発では開発中にスキーマが頻繁に変わる事も想定しているのか(実際にそれが理由なのかは知りませんが)、単純なメモリマッピングではなく、スキーマ更新をしても、ある程度後方/前方互換性が維持されるようになっています。
発表当初はC++用のライブラリが提供されましたが、現在では C++、C#、C、Go、Java、JavaScript、Lobster、Lua、TypeScript、PHP、Python、Rustと非常に多くの言語にポーティングされています。FlatBuffersは環境間交換フォーマットでもあるので、異なる言語間でデータを共有することもできます。
今回はUnityなので、C#用ライブラリを使います。ぱっと見た限り、C#用ライブラリはC++ライブラリの機能をすべては実装してはいないようです(例えばJSON対応)。一般的な利用には問題なさそうなので、困ったらその時に考えることにします。
環境構築
FlatBuffersを利用するためには「flatc.exe」と「FlatBuffers.dll」の二つのファイルが必要です。以下にそれぞれの環境構築方法を解説します。
今更ですが、以下(そして今後)ではWindows環境を想定しています。非Windows環境の場合、flatc.exeを独自にビルドしなければならないので、ちょっと大変かもしれません。
flatc.exe
flatc.exeはスキーマファイルからシリアライズ/デシアライズ用のコードを生成するジェネレーターです。
GithubのFlatBuffersのreleasesページを開きます。現在(2019/7/7)の最新版は1.11.0になります。
https://github.com/google/flatbuffers/releases
Assetsからflatc_windows_exe.zipをダウンロードして展開します。中身はflatc.exeのみです。任意のフォルダに配置しておきます。
FlatBuffers.dll
先ほどのサイトのSource code(zip)をクリックしてzipファイルをダウンロードして展開します。このソースコードをビルドしてFlatBuffers.dllを作成し、それをUnityのプロジェクトに追加します。
ビルドの手順は以下の通りです(VS2017の場合)
- 「ファイル」メニュー>「開く」>「プロジェクト/ソリューション」を選択
- zipを展開したフォルダを開き「FlatBuffers.csproj」を選択
- 「ビルド」メニュー>「構成マネージャー」を選択
- FlatBuffersの構成をdebugからReleaseに変更して「閉じる」を選択
- 「ビルド」メニュー>「FlatBuffersのビルド」を選択。
- ".\bin\Release"配下にに"FlatBuffers.dll"と"FlatBuffers.pdb"が生成される
- VSを閉じる。slnファイルを作成するか聞かれるが不要なので「いいえ」
- "FlatBuffers.dll"をUnityプロジェクトの"Assets/Plugins "配下に配置(Pluginsフォルダが無ければ作る)。
Pluginsフォルダは、Unityで定義されている特殊なフォルダー名で、ネイティブコードを含むdllファイルを配置するフォルダです。PluginsフォルダはUnityプロジェクト内で1個だけ、かつ、Assetsフォルダの直下に置かれる必要があります。
pdbファイルはデバッガー用のシンボル(.pdb)ファイルなので不要です(多分。よく知らない)。リリースビルドではなくデバッグビルドでdllを作るべきなのかもしれませんが、これも良く知らないので困ったら考えます。
続く
FlatBuffersを使用する準備ができたので、次こそコードを書きます。