UnityのSpritePackerで2048以上のサイズの画像を使う方法について


スプライトパッカー

UnityのSpritePackerはマニュアルに「デフォルトの最大アトラスサイズは 2048x2048 です」とある通り、2048を超える画像を扱えず、超えてしまっている画像にPackingTagを設定してPackを行おうとすると下記のエラーが発生します。

※テスト用に作成した4096x4096の画像(sample_4096)にPackingTag("hoge")を付けてPackを行った際に出力されたもの。

こちらですが、CustomPackingPolicyを作成し、最大アトラスサイズを変更することで拡張可能みたいだったので下記に手順を纏めます。

CustomPackerPolicyの作成

先ず最初にカスタム用のPackerPolicyクラスを作成します。

一からIPackerPolicyを継承したクラスを作成して作ることも可能ですが、今回はUnityマニュアルのスプライトパッカーの下の方にあるDefaultPackerPolicyのソースをEditor以下に作成したソースファイルに丸コピし、これを基にして手を加えていきたいと思います。

※丸コピしたらDefaultPackerPolicySampleが追加されます。IPackerPolicyを継承したクラス名が表示名になる模様。

作成したら70行目ぐらいにあるforeach内のentry.settings.maxWidthとentry.settings.maxHeightに設定したい最大サイズを代入します。

// 変更前
//entry.settings.maxWidth = 2048;
//entry.settings.maxHeight = 2048;            
// 変更後(最大サイズを4096x4096にする場合)
entry.settings.maxWidth = 4096;
entry.settings.maxHeight = 4096;            

上記の変更を加えたら、PackerPolicyに追加したカスタムポリシーを設定してPackをする事で最大4096のAtlasが作成可能です。

その他

上記のDefaultPackerPolicyは大まかに纏めると内部で下記の処理を行っているみたいです。

  • PackingTagが設定されているTextureの設定情報を取得し、Entryクラスに情報を保持してListに確保
  • EntryのListをPackingTag名でグループ化し、更に設定情報でグループ化
  • 最後に上記で割り出したグループに応じてAtlasを作成

真ん中の「設定情報でグループ化」の処理を逆手に取る方法として、70行目ぐらいにあるforeachの中のEntryを保持している箇所を決まった形式で設定する様に書き換える事で「同じPackingTagが設定されている物はTexture毎の設定関係無しに決まったフォーマットのAtlasを作成」「AtlasについてはGenerate Mip MapsはTexture毎の設定を無視して必ずfalse」と言った形にする事も可能かと思われます。