Created page with "ResonitePackage というパッケージ方式がある。この形式はUnityでデファクトスタンダードとなっているunitypackageのように、brsonとは異なる後方互換性が担保されたフォーマットになっている。 しかし、それを外部から読みたいこともあるだろう。そこで、構造を調査したメモを書き留めておく。 パッケージはZIPファイルで圧縮され..." |
m 細部の補足 Tag: 2017 source edit |
||
(One intermediate revision by the same user not shown) | |||
Line 1: | Line 1: | ||
== 概要 == | |||
[[ResonitePackage]] というパッケージ方式がある。この形式はUnityでデファクトスタンダードとなっているunitypackageのように、[[User:Kisaragi marine/brson|brson]]とは異なる後方互換性が担保されたフォーマットになっている。 | [[ResonitePackage]] というパッケージ方式がある。この形式はUnityでデファクトスタンダードとなっているunitypackageのように、[[User:Kisaragi marine/brson|brson]]とは異なる後方互換性が担保されたフォーマットになっている。 | ||
(編注: brsonは後方互換性が担保されないと明言されている。) | |||
Resoniteの公式クライアントはメモリをギガバイトオーダーで消費する上起動が遅いとか、起動しないで編集したいとかで、ResonitePackageを外部から読みたいこともあるだろう。そこで、構造を調査したメモを書き留めておく。 | |||
== 形式 == | |||
パッケージはZIPファイルで圧縮されている。ルートディレクトリに<code>R-Main.record</code>というファイルがあるのでそれを読む。<code>R-Main.record</code>は[[User:Kisaragi marine/record|Cloud Record]]を表現するJSONだが、ここで関心があるのは<code>assetUri</code>と<code>assetManifest</code>という2つのフィールドだ。 | |||
<code>assetUri</code>は<code>packdb</code>という<code>resdb</code>や<code>resrec</code>**ではない**URIスキーマになっているはずだ。これはパッケージの内部に存在するルートオブジェクトのハッシュを表示している。例えば、<code>packdb:///my_main_object</code>ならパッケージの中に<code>my_root_object</code>というハッシュで一位に定まるアセットが存在するはずだ (注: 実際のハッシュは16進数である。以下同様)。 | |||
<code>assetManifest</code>は当該パッケージが含むアセットを列挙する。具体的には以下の2つのプロパティを持つオブジェクトの配列だ: | |||
* <code>hash</code>: アセットのハッシュ。 | |||
* <code>bytes</code>: アセットのバイト数。 | |||
URIが | <code>assetUri</code>の<code>packdb</code>スキームをメモしたら、パッケージに戻って<code>/Assets/</code>を見る。そうするとアセットがずらっと並んでいるだろう。今用事があるのは<code>/Assets/my_root_object</code>なのでそれを見る。ルートオブジェクトは[[User:Kisaragi marine/brson|Data Tree Dictionary]]が書き出したものなので、いい感じに解凍する。 | ||
アセットは大概[[Component:StaticTexture2D| | |||
URIが<code>@packdb:///my_referenced_asset</code>のようにvalidではないURIになっていたら、先頭の<code>@</code>をちぎる。その後、<code>/Assets/my_referenced_asset</code>を見る。 | |||
アセットは大概[[Component:StaticTexture2D|<code>StaticTexture2D</code>]]から参照されているPNGか、[[Type:MeshX|MeshX]]と呼ばれるメッシュ情報だろう。他にも[[Type:AudioClip|AudioClip]]などがあるかもしれない。 | |||
注釈: [[Type:MeshX|MeshX]]の頂点情報はLZ4またはLZMAで圧縮されている。 | 注釈: [[Type:MeshX|MeshX]]の頂点情報はLZ4またはLZMAで圧縮されている。 |
Latest revision as of 09:52, 11 January 2025
概要
ResonitePackage というパッケージ方式がある。この形式はUnityでデファクトスタンダードとなっているunitypackageのように、brsonとは異なる後方互換性が担保されたフォーマットになっている。 (編注: brsonは後方互換性が担保されないと明言されている。)
Resoniteの公式クライアントはメモリをギガバイトオーダーで消費する上起動が遅いとか、起動しないで編集したいとかで、ResonitePackageを外部から読みたいこともあるだろう。そこで、構造を調査したメモを書き留めておく。
形式
パッケージはZIPファイルで圧縮されている。ルートディレクトリにR-Main.record
というファイルがあるのでそれを読む。R-Main.record
はCloud Recordを表現するJSONだが、ここで関心があるのは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で圧縮されている。