User:Kisaragi marine/resonitepackage

From Resonite Wiki
Revision as of 16:20, 8 November 2024 by Kisaragi marine (talk | contribs) (Created page with "ResonitePackage というパッケージ方式がある。この形式はUnityでデファクトスタンダードとなっているunitypackageのように、brsonとは異なる後方互換性が担保されたフォーマットになっている。 しかし、それを外部から読みたいこともあるだろう。そこで、構造を調査したメモを書き留めておく。 パッケージはZIPファイルで圧縮され...")
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

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で圧縮されている。