渋谷ほととぎす通信

完全趣味でやってるUnityメモ。説明できないところを説明できるようにするための個人ブログ。昨日の自分より少しでも大きくなれるように。。。 ※所属団体とは一切関係がありません

Unity 同じタグ名なのにSpriteがアトラス化されない時の対処法


f:id:esakun:20150730215258g:plain

開発環境

  • Unity5.3.6f1

Unityバージョン4.6辺りからテクスチャを1枚にパックする(1枚のテクスチャにする)機能があります。
※パックされた1枚のテクスチャを アトラス と呼びます。

そもそもなぜ アトラスにするのかというと描画負荷軽減のためです。
アトラスにしない場合 テクスチャ1枚につき1マテリアル を作ることになります。

するとAオブジェクト、Bオブジェクトを描画する際に2回の描画命令が必要です。

  1. Aを描画するためにマテリアルを切り替える
  2. Bを描画するためにマテリアルを切り替える

というイメージです。

パックしていると、A、B両方を1回の描画命令で表示することができ、描画負荷を下げることが出来ます。
※1回で描画させるためには条件が複数ありますが本稿では言及しません

ここまでをまとめると、同じマテリアルを使いまわすことで、描画命令回数を削減しパフォーマンスを上げることが出来るということです。
※最終実機で計測する必要があります。一概にパフォーマンスが上がる訳ではありません。

f:id:esakun:20161013095230p:plain

テクスチャの設定をこのようにすると、とりあえずはアトラスは生成されます。

  • Texture Typeを Sprite(2D and UI)にする
  • Packing Tagに名前を付ける

パックされない落とし穴

以下の2種類のテクスチャを先の設定にしてもパックされません。

f:id:esakun:20161014214259p:plain f:id:esakun:20161014214231p:plain
A.透明部分を含む画像 B.不透明画像

なぜなら Texture TypeSprite(2D and UI) の場合、画像のフォーマットを透明を含む画像かどうかで自動的に判別して設定してしまうからです。

f:id:esakun:20161014214032p:plain

例えばFormatを Truecolor に設定した場合以下のような画像フォーマットに自動で変換されます。

A.透明部分を含む画像 B.不透明画像
RGBA32bit RGB24bit

どうやって変換後のフォーマットを確認するのかというと、テクスチャを選択したインスペクタのプレビュー下部に記述されています。(ピンク枠内参照)
f:id:esakun:20161014223123p:plain:w300

1枚のテクスチャにするわけなので1種類のフォーマットを決める必要があります。そこで複数のフォーマット設定が混在しているとパックすることは出来ません。

解決方法 : Texture TypeをAdvancedに変更

f:id:esakun:20161014223657p:plain

Advanced に変更するとテクスチャに対して細かい設定することが可能になります。

パックするために必要な設定項目は3つあります。

  1. SpriteModeとPacking Tag
  2. Format
  3. Non Power of 2

1.SpriteModeとPacking Tag

これをすることでパック対象のテクスチャに設定されます。

設定項目 設定内容
SpriteMode Signle
Packing Tag 任意の文字列

2.Format

何度も登場している画像フォーマットです。用途によって設定するわけですが、方針としてパックしたい全ての画像のフォーマットを揃えることです。

また、透明画像と不透明画像が混合した状態でパックする場合は、透明を設定したフォーマットにする必要があります。 今回の場合だと両テクスチャ RGBA 32bit に設定することで同じフォーマットになります。
※圧縮テクスチャを使用したい場合も同じです。

3.Non Power of 2

聞きなれない人もいるかもしれませんが、テクスチャを2のべき乗にサイズに強制的にリサイズする機能です。2のべき乗にしないと使用できない画像フォーマットに設定したいときなどに使用しますが、パックする場合は使用しません。 None を設定します。

逆に None 以外を設定して Power of 2を有効化してしまうと以下のようなワーニングが出力し、パックすることは出来ません。

Sprites can not be generated from textures with NPOT scaling.

※NPOTとは Non Power of 2(Two)の略称です。
Non Power of 2の設定は忘れやすいです。

無事にパックされました

f:id:esakun:20161014230124p:plain ※画像の端(黄色の部分)が伸びてたりするのはUnityが自動で処理している無いようなので無視してOK

パックされた画像は、 Window > Sprite Packer から確認できます。

テクスチャ設定を変更してもパックの更新されていない場合は、左上の Pack をクリックすると最新化されます。
f:id:esakun:20161014230514p:plain
※もしくは再生したタイミングでも更新が走ります。

UnityゲームUI実践ガイド 開発者が知っておきたいGUI構築の新スタンダード

UnityゲームUI実践ガイド 開発者が知っておきたいGUI構築の新スタンダード

あわせて読みたい記事

www.shibuya24.info

www.shibuya24.info

www.shibuya24.info

余談1

Texture TypeをAdvancedにすると選べるFormatが増えます。

f:id:esakun:20161014231337p:plain

このときにAutomatic~~ を選んでしまうと再度パックされなくなります。 Advanced以外のフォーマット設定では内部的に Automatic~~ が実行されているためです。

余談2

アトラス化されたテクスチャはUnityの内部で保持しているようで、ダウンロードすることは出来ません。