User:Kisaragi marine/resonitepackage

From Resonite Wiki

概要

ResonitePackage というパッケージ方式がある。この形式はUnityでデファクトスタンダードとなっているunitypackageのように、brsonとは異なる後方互換性が担保されたフォーマットになっている。 しかし、それを外部から読みたいこともあるだろう。そこで、構造を調査したメモを書き留めておく。

形式

パッケージはZIPファイルで圧縮されている。ルートディレクトリにR-Main.recordというファイルがあるのでそれを読む。R-Main.recordCloud Recordだが、ここで関心があるのはassetUriassetManifestという2つのフィールドだ。 assetUripackdbというresdbresrec**ではない**URIスキーマになっているはずだ。これはパッケージの内部に存在するルートオブジェクトのハッシュを表示している。例えば、packdb:///my_main_objectならパッケージの中にmy_root_objectというハッシュで一位に定まるアセットが存在するはずだ (注: 実際のハッシュは16進数である。以下同様)。 assetManifestは当該パッケージが含むアセットを列挙する。具体的には以下の2つのプロパティを持つオブジェクトの配列だ:

  • hash: アセットのハッシュ。
  • bytes: アセットのバイト数。

assetUripackdbスキームをメモしたら、パッケージに戻って/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で圧縮されている。