土屋つかさの技術ブログは今か無しか

土屋つかさが主にプログラミングについて語るブログです。

#unity (C#)でFlatBuffersを使い倒す(2) FlatBuffersの導入手順

 前回、ゲームで用いる数値データを管理する手段として一般的な、バイナリデータを構造体配列にマッピングする手法について解説しました。今回からは、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の場合)

  1. 「ファイル」メニュー>「開く」>「プロジェクト/ソリューション」を選択
  2. zipを展開したフォルダを開き「FlatBuffers.csproj」を選択
  3. 「ビルド」メニュー>「構成マネージャー」を選択
  4. FlatBuffersの構成をdebugからReleaseに変更して「閉じる」を選択
  5. 「ビルド」メニュー>「FlatBuffersのビルド」を選択。
  6. ".\bin\Release"配下にに"FlatBuffers.dll"と"FlatBuffers.pdb"が生成される
  7. VSを閉じる。slnファイルを作成するか聞かれるが不要なので「いいえ」
  8. "FlatBuffers.dll"をUnityプロジェクトの"Assets/Plugins "配下に配置(Pluginsフォルダが無ければ作る)。

 Pluginsフォルダは、Unityで定義されている特殊なフォルダー名で、ネイティブコードを含むdllファイルを配置するフォルダです。PluginsフォルダはUnityプロジェクト内で1個だけ、かつ、Assetsフォルダの直下に置かれる必要があります。
 pdbファイルはデバッガー用のシンボル(.pdb)ファイルなので不要です(多分。よく知らない)。リリースビルドではなくデバッグビルドでdllを作るべきなのかもしれませんが、これも良く知らないので困ったら考えます。

続く

 FlatBuffersを使用する準備ができたので、次こそコードを書きます。