つくりました。 rubygems.org
ひととおりの使い方は GitHub に書いたので参考にしてください。
Unity のアセットバンドルファイルを展開するツールには UnityPack や disunity があるけれど、結構よく落ちたりちゃんと動かなかったり使いにくかったりして面倒だったので、新たにつくった。
前川みくなのはたまたまディレクトリの名前がそうだったというだけで、特別な意味はない。
もくじ
このライブラリの目的は
Unity で読み込む場合はそもそもこんなツールを使わなくてよくて、直接 AssetBundle を読み込めばよい。
Unity はシェルスクリプトのような操作がしにくいのが難点である。どうしてもアセット内の画像を抽出したいとかいうニーズがなぜかしら生まれてしまう(これはあるいは夢でも見ているのかもしれない)ので、スクリプトによって抽出できる仕組みが必要だったわけである。
バージョンについて
3.9.0 でリリースしている。メジャー・マイナーバージョンを上げるつもりはない。セマンティックバージョニング? 聞いたことない名前だな。
unity3d ファイルの構造
gem を作ったのはいいものの、ちゃんと unity3d ファイルの構造を理解していないと操作できないと思うのでメモがてら書いておく。
基本的に Unity のアセットバンドルファイル(*.unity3d ファイル)の中にはアセットを複数入れることができる。それぞれのアセットには
- クラス
- クラスに対応するタイプツリー
- オブジェクト
の 3 つが含まれている。クラス、タイプツリーはおおよそそのオブジェクト構造の定義で、実体はオブジェクトにある。
クラスとタイプツリーは 1 対 1 なのだが、デフォルトのタイプツリーの場合はタイプツリーがデータに含まれない場合がある。この場合は UnityPack でも disunity でも mikunyan でもデフォルトのタイプツリーを持っておく方式をとっている。
オブジェクトはタイプツリーのデータをもとに復元できる。mikunyan では parse_object を行うことで復元できる。もとのデータをなるべく再現するように復元する方式をとっているが、その分扱いにくくもなるので、parse_object_simple という関数も別に用意している。これは Hash、Array、Integer、Float、String 以外には登場しない形になる。なおタイプツリーが判別できなかった場合にはオブジェクトの展開には失敗してしまう。
それぞれのオブジェクトには Path ID が付けられている。Path ID が 1 のオブジェクトは特別で、ここにはおよそアセットのメタデータが含まれており、ここからファイルのリストを作ることができる。mikunyan では asset.containers を呼び出すとこのファイルリストを作ることができる。
なお mainData を始めとした特殊なアセットはこれらの仕様を若干逸脱することがある(読み込む操作はできるようになっている)ので注意されたい。
テクスチャの復元
テクスチャはエンディアンに依存しているので、エンディアンの残っていない parse_object_simple の出力からは作れない。
単純なビット列からできる物(RGBA32 など)はそのまま動かしている。ETC1 は仕様をもとにデコーダを書いている。ETC1 についてはこのページがとても参考になる(というか完全に正しい)。
なお ETC2 にも対応した。ASTC にも対応したいがあまりに複雑なので断念している……。
ASTC にも対応した。Ruby で ASTC のデコーダが実装されたのは世界で初めてなんじゃないか。