Unity
UnityDay 12

unityでのatlas texture2018最新状況

はじめに

こんにちは、amazing programmerです
突然ですがatlas texture使ってますか?
NGUIのころはtexture packerやshoe boxで手動で作ってたなぁていう人多いんじゃないでしょうか
あれから早幾年月
unityも標準でatlas textureに対応してくれました
http://kan-kikuchi.hatenablog.com/entry/SpritePostprocessor
http://kan-kikuchi.hatenablog.com/entry/SpriteAtlas
あれ?2種類ありますね???
http://tsubakit1.hateblo.jp/entry/2018/12/14/221116
あれれ??2018.3でugui対応????
混乱してきました、
整理しましょう

unityでatlas texture使う方法

SpriteAtlas

https://docs.unity3d.com/ja/2018.1/Manual/SpriteAtlas.html
一番新しい機能です、直感的で使いやすいです
弱点は後述しますがassetbundleと組み合わせるとトラブりやすいです

sprite packer

https://docs.unity3d.com/ja/2018.1/Manual/SpritePacker.html
unity5時代のものでしょうか
inspectorで各spriteにタグをつけるとタグごとにatlas textureが内部的に生成される感じです
atlas textureが目に見えなくて管理しにくいです
1つのspriteを複数のatlasで使うといったこともできません
Resources以下のspriteには未対応というのも致命的で最近は全く使ってないです

TexturePackerなどの外部ツール

https://qiita.com/takesuke/items/b8f06d46943d3b22d4db
だいたいデザイナさんにお願いして作ってもらったり
ルール決めて自動化したりするんじゃないでしょうか
リンク先あるとspriteが見えてるんでuguiとも組み合わせられそうです(確か以前仕事でもそんなフローにしてたような

おすすめAtlasTexture

それで結局どれが一番いいんですかーっていうわけなんですが
ちょっと場合分けして考えていきましょうか

AssetBundleを使わない場合

https://docs.unity3d.com/ja/2018.1/Manual/SpriteAtlas.html
SpriteAtlas一択で
その際Include in buildにチェックを忘れずに

AssetBundleを使う場合

ほとんどの場合SpriteAtlas==1assetbundleとして運用すると思います
その際Include in buildのチェックを外さないとダメです
そうしないとatlas spriteの参照を持った全て(buildだったり、別assetbundleだったり)にSpriteAtlas textureが含まれてしまいます!!!
そんな馬鹿なと思うかもしれませんがマジです。assetbundle dependencyとは何だったのか
そしてチェックを外した場合
https://docs.unity3d.com/ja/current/ScriptReference/U2D.SpriteAtlasManager-atlasRequested.html
この謎のunity イベント経由でSpriteAtlasインスタンスを渡してあげないとダメなのです!!!!!

SpriteAtlasと元となるSpriteを同じAssetBundleに格納することでdependencyがつきました
dependencyがつくのでInclude in buildのチェックはつけたままでOKです
atlas textureとsprite textureが全部AssetBUndleに含まれるんじゃないかと不安になりましたが検証したらそんなことはなかったです

Unity2018.3以上

http://tsubakit1.hateblo.jp/entry/2018/12/14/221116
おめでとうございます、spriteAtlas遅延バインディングがuguiに対応しました
安心してSpriteAtlas使ってください

それ以外の古いunity(2017.4LTS含む

https://feedback.unity3d.com/suggestions/unity-2017-sprite-atlas-ugui-bindings
残念ながらspriteAtlas遅延バインディングはSpriteRendererにしか対応してません…ugui非対応です…
FeedBackの悲痛な叫びは届いたけど反映はされませんでした…(まぁLTSはバグフィックスだけですからね
ということはsprite packerか外部ツールを…

2017.4で試しにuguiでも試したらatlasRequested呼ばれてるぞ…??

そのまま同期的にSpriteAtlas返したら表示されました
非同期的にSpriteAtlas返したら白い□になりました(表示失敗
公式ではサポートされてないのでマイナーバージョンアップしたら死ぬかもしれないけど…ありじゃね?
実装としては必要になる前にアセットバンドルをメモリに読んでおいて、同期的にLoadAssetするとか、そもそも事前にSpriteAsset取り出してメンバ変数に保持しておけばよしよしな気がします

まとめ

SpriteAtlasでいいんじゃない?