Edited at
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でいいんじゃない?