Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

スプライトパッカー

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

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

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

CustomPackerPolicyの作成

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

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

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

作成したら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が作成可能です。

ccc.jpg

その他

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

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

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

mao_
エンジニア/最推しのバーチャルタレント(VTuber)は『巻乃もなか』さん
showroom
SHOWROOMは、アイドルやアーティストとインターネット上でコミュニケーションが楽しめるライブ動画ストリーミングプラットフォームです。
https://www.showroom-live.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away