ResonitePackage というパッケージ方式がある。この形式はUnityでデファクトスタンダードとなっているunitypackageのように、brsonとは異なる後方互換性が担保されたフォーマットになっている。 しかし、それを外部から読みたいこともあるだろう。そこで、構造を調査したメモを書き留めておく。
パッケージはZIPファイルで圧縮されている。ルートディレクトリに`R-Main.record`というファイルがあるのでそれを読む。`R-Main.record`はCloud Recordだが、ここで関心があるのは`assetUri`と`assetManifest`という2つのフィールドだ。 `assetUri`は`packdb`という`resdb`や`resrec`**ではない**URIスキーマになっているはずだ。これはパッケージの内部に存在するルートオブジェクトのハッシュを表示している。例えば、`packdb:///my_main_object`ならパッケージの中に`my_root_object`というハッシュで一位に定まるアセットが存在するはずだ (注: 実際のハッシュは16進数である。以下同様)。 `assetManifest`は当該パッケージが含むアセットを列挙する。具体的には以下の2つのプロパティを持つオブジェクトの配列だ:
- `hash`: アセットのハッシュ。
- `bytes`: アセットのバイト数。
`assetUri`の`packdb`スキームをメモしたら、パッケージに戻って`/Assets/`を見る。そうするとアセットがずらっと並んでいるだろう。今用事があるのは`/Assets/my_root_object`なのでそれを見る。ルートオブジェクトはData Tree Dictionaryが書き出したものなので、いい感じに解凍する。
URIが`@packdb:///my_referenced_asset`のようにvalidではないURIになっていたら、先頭の`@`をちぎる。その後、`/Assets/my_referenced_asset`を見る。 アセットは大概`StaticTexture2D`から参照されているPNGか、MeshXと呼ばれるメッシュ情報だろう。他にもAudioClipなどがあるかもしれない。
注釈: MeshXの頂点情報はLZ4またはLZMAで圧縮されている。