こんにちは、エンジニアのオオバです。

お悩みさん
お悩みさん
  • UnityのSpriteAtlasを使ってみたい
  • SpriteAtlasの始め方が分からない
  • V1とV2どっちを使えばいいの?
  • オオバ
    オオバ
    本記事ではこれらの悩みを解決します。

    SpriteAtlas(スプライトアトラス)とは、複数の画像を1枚の画像に合成したアセットです。1枚の画像にする最大の理由はパフォーマンスのため。具体的にはDraw Call(ドローコール)と呼ばれるCPU負荷軽減です。
    【Unity】SpriteAtlasの使い方!Spriteを1枚にパックして描画負荷を下げる_0
    上図のとおり本来6回の描画処理が必要なところ(左)、SpriteAtlasを使うことで1回で描画できるといったパフォーマンスの向上が期待できます。

    本記事ではSpriteAtlasの始め方から使い方、各種設定までを詳しく解説します。特に2DゲームやUIを開発する人は必ず知っておいた方がよいテクニックです。ぜひ最後まで読んでみてください。

    SpriteAtlasは作って画像を入れるだけ!今はV2が標準

    はじめに結論を簡単にまとめます。

    SpriteAtlasの結論

    ①SpriteAtlasは複数のSpriteを1枚にパックしてDraw Callを削減する機能

    ②Unity 2022.2以降はSprite Atlas V2が標準(Unity 6もV2)

    ③使い方はSpriteAtlasを作成して画像かフォルダを追加するだけ

    ④UIで使うときはAllow RotationとTight PackingはOFFにする

    昔はProject Settingsで有効化しないと使えない機能でしたが、今のUnityではその手順は不要になりました。

    それぞれ詳しく解説していきます。

    SpriteAtlasを始める準備

    まずはSpriteAtlasを使うための準備を確認します。

    SpriteAtlasを始める前の確認事項

    ①2D Spriteパッケージがインストールされているか

    ②Sprite Atlas V1とV2どちらのモードで動いているか

    ①2D Spriteパッケージのインストール

    SpriteAtlasを使うには「2D Sprite」パッケージが必要です。

    2Dテンプレートで作ったプロジェクトであれば最初からインストールされています。 この場合は何もしなくて大丈夫です。

    3Dテンプレートで作ったプロジェクトには入っていないため、 メニュー Window > Package Manager からPackage Managerウィンドウを開きます。

    【Unity】SpriteAtlasの使い方!Spriteを1枚にパックして描画負荷を下げる_1
    左上のプルダウンを「Packages: Unity Registry」にして「2D Sprite」をインストールしてください。

    メニュー Assets > Create > 2D > Sprite Atlas が表示されていればインストール済みと判断できます。

    ②Sprite Atlas V1とV2の確認

    SpriteAtlasには「V1」と「V2」という2つのバージョンが存在します。

    Unity 2022.2以降はV2がデフォルトで有効になっているため、新規プロジェクトなら何も設定せずそのままV2を使えばOKです。 もちろんUnity 6もV2が標準。

    現在のモードは メニュー Edit > Project Settings > Editor 内の「Sprite Atlas > Mode」で確認できます。

    ※2018年の本記事初稿ではProject SettingsでV1を有効化する手順を解説していましたが、現在この作業は不要になりました

    注意が必要なのは、V1で運用してきた既存プロジェクトをV2へ切り替えるケースです。

    ModeをV2に変更すると、プロジェクト内のV1のSpriteAtlasアセットは 自動でV2へ移行 されます。

    そしてこの移行は元に戻せません。

    V2化したアセットはV1と互換性がないため、切り替える前に必ずプロジェクトのバックアップを取っておきましょう。

    とはいえ使い方自体はV1もV2もほぼ同じです。ここから先の解説は、どちらのバージョンでもそのまま使えます。

    SpriteAtlasの基本的な使い方

    SpriteAtlasの準備ができたので、ここからは基本的な使い方を解説していきます。

    SpriteAtlasの基本的な使い方

    ・SpriteAtlasを作成して画像を1枚にパック

    ・SpriteAtlasのSpriteを使う

    ・SpriteAtlasからSpriteを取り出す方法

    SpriteAtlasを作成して画像を1枚にパック

    最初にSpriteAtlasを作成します。 メニュー Assets > Create > 2D > Sprite Atlas をクリックしてください。
    【Unity】SpriteAtlasの使い方!Spriteを1枚にパックして描画負荷を下げる_2
    するとProjectウィンドウにSpriteAtlasが作られます(V2では拡張子が .spriteatlasv2 になります)。SpriteAtlasの各種設定項目については「→ SpriteAtlasの各種設定項目」で後述します。

    【Unity】SpriteAtlasの使い方!Spriteを1枚にパックして描画負荷を下げる_3
    作ったSpriteAtlasの「Objects for Packing」に画像(Sprite)をドラッグアンドドロップしましょう。

    【Unity】SpriteAtlasの使い方!Spriteを1枚にパックして描画負荷を下げる_4

    画像を追加したら「Pack Preview」ボタンをクリックします。すると追加した画像が1枚にパックされた結果をプレビューで確認できます。

    おすすめはSpriteAtlasにフォルダをまるごと追加

    1枚ずつ画像をSpriteAtlasに追加する方法もありですが、おすすめはフォルダのまるごと追加です。以下の動画のようにSpriteを格納したフォルダをSpriteAtlasに追加します。

    【Unity】SpriteAtlasの使い方!Spriteを1枚にパックして描画負荷を下げる_5

    すると、1度の作業で追加できて便利です。また保守の面でも優秀です。フォルダ内の画像を入れ替えることで自動でSpriteAtlasを更新できるのです。

    特に理由がない場合はSpriteAtlasにはフォルダを追加しましょう。

    SpriteAtlasに画像が追加できない時の対処法

    SpriteAtlasにうまく画像を追加できないときがあります。そんなときは追加しようとしている画像の Texture Type をチェックしてみてください。
    【Unity】SpriteAtlasの使い方!Spriteを1枚にパックして描画負荷を下げる_6
    Texture Typeが「Sprite(2D and UI)」であることを確認しましょう。

    SpriteAtlasの使い所

    SpriteAtlasの使い所は大きく2つ。uGUIとSpriteRendererです。

    uGUIでSpriteAtlasを使用する

    uGUIの場合は「Imageコンポーネント」を使ってSpriteを利用します。

    【Unity】SpriteAtlasの使い方!Spriteを1枚にパックして描画負荷を下げる_7
    Imageの「Source Imageプロパティ」にSpriteをセットするだけで自動的にSpriteAtlas経由のアクセスになります。

    【Unity】SpriteAtlasの使い方!Spriteを1枚にパックして描画負荷を下げる_8
    少し余談ですが、Imageの便利機能「SetNativeSize」を紹介します。 SetNativeSizeはSpriteの元サイズをUIに反映できます。

    【Unity】SpriteAtlasの使い方!Spriteを1枚にパックして描画負荷を下げる_9
    つまりRectTransformの幅と高さをSpriteのサイズにできるのです。UIを作る上で頻度高く使用するためぜひ覚えておきましょう。

    SpriteRendererでSpriteAtlasを使用する

    SpriteRendererもuGUIと同様で、SpriteAtlasでパックされたSpriteを普段どおりに使うだけで良いです。ただしSpriteRendererにセットされたSpriteのサイズ感覚はuGUIと違います。

    【Unity】SpriteAtlasの使い方!Spriteを1枚にパックして描画負荷を下げる_10
    SpriteRendererのサイズ調整はスケールで行います。幅と高さというプロパティは持っていません。

    Spriteには個別の単位「Pixels Per Unit」という設定があります。これはスケール1に対して何ピクセル使うかという単位です。
    【Unity】SpriteAtlasの使い方!Spriteを1枚にパックして描画負荷を下げる_11
    例えばPixels Per Unitが「100」であれば、スケール1のときにディスプレイ上では100ピクセル使うということです。この「Pixels Per Unit」は 各Spriteごとに設定 できます。

    Pixels Per Unitをわかりやすく図解

    【Unity】SpriteAtlasの使い方!Spriteを1枚にパックして描画負荷を下げる_12
    詳しくは次の記事で解説していますので2Dゲームを作る方はぜひ読んでみてください。

    SpriteAtlasからSpriteを取り出す方法

    SpriteAtlasからSpriteをプログラムから取り出すことができます。

    Sprite sprite = _atlas.GetSprite("スプライト名");  
    

    上記のような感じでSpriteを取得できます。もちろんSpriteAtlas内に存在しないSpriteはnullとして返ってきます。

    しかし、事前にSprite名を知らないケースもありますよね。そんなときは以下のようなコードで解決します。

    // SpriteAtlasに含まれるすべてのSpriteを取り出すサンプル  
    var sprites = new Sprite[_atlas.spriteCount];  
    _atlas.GetSprites(sprites);  
    foreach(var sprite in sprites)  
    {
        Debug.Log(sprite.name);  
    }
    

    SpriteAtlasに実装されている GetSprites メソッドを使うとAtlas内のすべてのSpriteを配列で取得できるので活用してみてください。

    SpriteAtlasの各種設定項目

    SpriteAtlasの基本的な使い方を理解したところで、SpriteAtlasの各種設定を解説します。
    【Unity】SpriteAtlasの使い方!Spriteを1枚にパックして描画負荷を下げる_13
    いくつか重要な設定があるため、ぜひ頭に入れておきましょう。「細かいことはよくわからないよ」という方は「→ SpriteAtlasの設定まとめ」を参考にしてください。よく使う設定を表にしてわかりやすくまとめました。

    ※スクリーンショットは撮影当時のUnityの画面です。最新バージョンでは項目の並びが多少異なる場合がありますが、設定内容は同じです

    Type(Master or Variant)

    「Master」と「Variant」という2つのTypeを設定できます。 Typeは通常「Master」に設定するので大丈夫 です。Masterとは大元のSpriteAtlasです。VariantとはMasterの縮小版を作るときに役立ちます。

    例えば幅高さが2048×2048のSpriteAtlas(Master)のVariantを作ったとします。Variantには「Scale」を0.1〜1の範囲で指定できるのです。例えばここで「0.5」と入力してみましょう。すると ”Variant” のSpriteAtlasの幅と高さはそれぞれ半分の1024×1024になるのです。

    つまりVariantを利用することでメモリの使用量を減らせるということです。

    低スペック端末向けに解像度を落としたSpriteAtlasを出し分ける、といった使い方が代表例です。この仕組みはV2でも引き続き使えます。

    SpriteAtlas Variantの作り方

    SpriteAtlas Variantはまず空のSpriteAtlasを作ります。
    【Unity】SpriteAtlasの使い方!Spriteを1枚にパックして描画負荷を下げる_14
    TypeをVariantに変更しましょう。

    【Unity】SpriteAtlasの使い方!Spriteを1枚にパックして描画負荷を下げる_15
    Master Atlasに大元のSpriteAtlasをセットします。

    【Unity】SpriteAtlasの使い方!Spriteを1枚にパックして描画負荷を下げる_16
    VariantのScaleを0.5にしてみましょう。VariantのSpriteAtlasのサイズが大元の半分になります。つまりサイズが1024×1024になります。

    実際にプレビューを確認してみます。
    【Unity】SpriteAtlasの使い方!Spriteを1枚にパックして描画負荷を下げる_17
    このようにMasterとVariantのメモリ使用量が変わります。例えば低スペック向けにメモリ使用量を節約する方法の1つとして覚えておくと良いでしょう。

    SpriteAtlas Variantの使い方

    ではどのようにSpriteAtlas Variantを使えばよいでしょうか。最も簡単な方法は後述する「→ Include in Build」で行います。Include in Buildにチェックが入っている方が採用されるのです。

    【Unity】SpriteAtlasの使い方!Spriteを1枚にパックして描画負荷を下げる_18
    MasterのInclude in Buildチェックを外し、VariantのInclude in BuildチェックをONにしましょう。この状態でUnityを実行してみます。
    【Unity】SpriteAtlasの使い方!Spriteを1枚にパックして描画負荷を下げる_19
    するとMasterのSpriteAtlasを縮小したSpriteが適用されます。注意点として、Master、VariantはともにUnity実行時に反映されます。 Editモード中では画面が更新されません。

    Include in Build

    「Include in Build」にチェックするとビルドしたファイルにSpriteAtlasが含まれます。
    【Unity】SpriteAtlasの使い方!Spriteを1枚にパックして描画負荷を下げる_20
    基本はチェックONのままで大丈夫です。

    ただし、例外もありチェックを入れているけどビルドに含まれないケース、またその逆もあったりしますので、詳しく解説します。

    Include in Buildのチェックを入れてもビルドに含まれないケース

    Include in Buildにチェックを入れてもビルドに含まれない場合があります。それはSpriteAtlasまたはSpriteAtlasの中のSpriteがどこからも参照されていない場合です。SpriteAtlas自身、またはSpriteがゲーム内で参照されて初めてアプリに含まれることに注意しましょう。

    Include in Buildのチェックを外してもビルドに含まれる2つのケース

    Include in Buildのチェックを外してもビルドに含まれる場合が2つあります。

    ①SpriteAtlasが参照されているケース

    1つ目は「SpriteAtlasインスタンス自身が参照されている場合」です。

    [SerializeField] SpriteAtlas _atlas;  
    void Awake()  
    {
        Sprite sprite = _atlas.GetSprite("Sprite名");  
    }
    

    上記のようなスクリプトを使ってSpriteAtlasから GetSpriteメソッド でSpriteを取得するときに使います。

    ②SpriteAtlasがResourcesフォルダ内にある場合

    2つ目はSpriteAtlasがResourcesフォルダに含まれる場合です。この場合、SpriteAtlasがどこからも参照されていなくてもゲームに含まれてしまいます。 意図せずゲームのファイル容量が増えているとき にResourcesフォルダをチェックしてみると良いかもしれません。

    チェックを外すなら「Late Binding」が必要

    逆にInclude in Buildのチェックを外して運用するケースもあります。AssetBundleやAddressablesでSpriteAtlasを後から配信する、いわゆる本格的な運用のときです。

    この場合、SpriteAtlasのロードは自分で面倒を見る必要があります。

    SpriteAtlasManager.atlasRequested というコールバックにロード処理を登録しておき、要求されたタイミングでSpriteAtlasを渡す仕組みで、公式では 「Late Binding(遅延バインディング)」 と呼ばれています。

    何も実装せずにチェックだけ外すと、実行時にSpriteが表示されなくなるため注意してください。

    まずは通常のゲーム開発ならチェックON、Addressables等で配信管理するならOFF + Late Binding、と覚えておけば大丈夫です。

    Allow Rotation / Tight Packing

    「Allow Rotation」と「Tight Packing」はSpriteAtlasにより多くのSpriteを格納するための設定です。つまりビルドしたファイル容量の節約に繋がります。「Allow Rotation」はよりSpriteを詰め込むためにパックするSpriteを回転させるかどうか、「Tight Packing」とは、よりギチギチにパックする設定です。

    Tight Packingの詰め込み仕様

    Tight Packingがどのように詰め込むのか確認してみましょう。
    【Unity】SpriteAtlasの使い方!Spriteを1枚にパックして描画負荷を下げる_21
    Tight PackingのON/OFFを比較した画像です。パッと見何がTight Packingされたのかよくわからないので、わかりやすい部分を拡大してみます(↓下図)。

    【Unity】SpriteAtlasの使い方!Spriteを1枚にパックして描画負荷を下げる_22
    Spriteの矩形に対して「透明部分」に他のSpriteが食い込んでパックされるのです。

    UIで「Allow Rotation」「Tight Packing」は使用不可

    一見便利そうな「Allow Rotation」と「Tight Packing」はUI(uGUI)では使用不可です。
    【Unity】SpriteAtlasの使い方!Spriteを1枚にパックして描画負荷を下げる_23
    上図のとおりUIでは「Allow Rotation」と「Tight Packing」が正常に反映されません。この問題は最新のUnityでも変わっていません。 UIでSpriteAtlasを使用する場合は「Allow Rotation」と「Tight Packing」のチェックは外しておきましょう。

    「Allow Rotation」「Tight Packing」はSpriteRendererで使用

    「Allow Rotation」と「Tight Packing」はSpriteRendererで使用しましょう。
    【Unity】SpriteAtlasの使い方!Spriteを1枚にパックして描画負荷を下げる_24
    上の動画のとおりSpriteRendererでは意図通りの動作をします。繰り返しになりますが、SpriteAtlasはUnity実行時に反映されます。Editモード中は正常に見えてしまうため注意しましょう。

    Padding

    「Padding」とはSprite同士の間隔で「2、4、8」の3つから選択可能です。大きい値につれてパックするSprite同士の間隔が広がります。基本はデフォルトの「4」で大丈夫ですが、Spriteを表示したとき隣のSpriteも表示されてしまったときに調整します。

    特にVariantを使ったときです。
    【Unity】SpriteAtlasの使い方!Spriteを1枚にパックして描画負荷を下げる_25
    MasterのSpriteAtlasでは正常でしたが(左)、解像度を低くしたVariantでは画像がぼやけた分、隣のSpriteに侵食していることが分かります(真ん中)。Paddingを「8」に数値を上げることで対処した例です(右)。

    Variantの他に圧縮テクスチャを使用したときに画像がぼやけてしまうといった場合もあります。実際に目視で確認するしかありません。

    Read/Write Enabled

    「Read/Write Enabled」は基本的には「OFF」で大丈夫です。ONにするケースは何かしらの理由で、SpriteAtlasをランタイム中に読み書きしたい場合です。もしチェックをONにする場合は使用メモリが2倍になるため注意です。

    Generate Mip Maps

    「Generate Mip Maps」は必要に応じてON/OFF切り替えてください。UIで使用するSpriteAtlasであれば基本的に「OFF」です。Generate Mip MapsとはMip Map(ミップマップ)を作る機能です。Mip Mapとは1つの画像から複数解像度を下げた画像で、カメラからの距離に応じて低解像度の画像を使い、描画スピードを上げるのです。つまり解像度を下げた画像を自動生成するため、使用メモリが増えます。

    チェックをONにすると分かりますが、少しぼやけた印象を受けます。繰り返しになりますが、必要に応じてチェックを切り替えてください。

    sRGB

    基本的にチェックは「ON」で大丈夫です。sRGBとは色空間の話です。sRGBにチェックを入れるとこのSpriteAtlasがガンマ空間の色として認識されます。

    解説は割愛しますが、結論、初期設定のPhotoshopなどで画像を作成しているのであれば、sRGBにチェックを入れておくで大丈夫です。

    Filter Mode

    「Filter Mode」は必要に応じて「Point」または「Bilinear(バイリニア)」を選びます。 Filter Modeとは画像を拡大縮小した際の補間方法の指定 です。「Point」は補間しません。ドット絵のような逆に補間が効いてほしくないものに使用します。

    「Bilinear」「Trilinear(トリリニア)」はともになめらかに補間されます。「Bilinear」と「Trilinear」の違いは前述の「→ Generate Mip Maps」でMip Mapを使用したときに現れます。Mip Mapを使用しない場合はBilinearを使いましょう。

    各プラットフォームの圧縮テクスチャ設定

    Inspector下部のプラットフォームタブから、iOSやAndroidなどプラットフォームごとに圧縮テクスチャを設定できます。
    【Unity】SpriteAtlasの使い方!Spriteを1枚にパックして描画負荷を下げる_26
    スマホ向け開発であればiOS、AndroidともにASTCを選んでおけば間違いありません。

    SpriteAtlasの設定まとめ

    よく使うSpriteAtlas設定を表にまとめました。困った時の参考にしてみてください。

    項目設定内容
    TypeMaster
    Include in BuildON
    Allow RotationON(UIではOFF)
    Tight PackingON(UIではOFF)
    Padding4
    Read/Write EnabledOFF
    Generate Mip MapsOFF
    sRGBON
    Filter ModeBilinear

    SpriteAtlasの3つの注意点

    ここからはSpriteAtlasの使用上の注意点を紹介します。

    SpriteAtlasの3つの注意点

    ①元画像をResourcesフォルダに入れてはダメ

    ②いつの間にかSpriteAtlasの枚数の増加に注意

    ③UIにTight Packing、Allow Rotationは禁止

    注意点①元画像をResourcesフォルダに入れてはダメ

    元画像をResourcesフォルダに入れてはいけません。なぜなら本来SpriteAtlasでまとめられた1枚の画像だけがゲームに格納されるはずです。しかしResourcesフォルダに元画像を格納するとSpriteAtlasと元画像どちらもゲームに格納されてしまうのです。
    【Unity】SpriteAtlasの使い方!Spriteを1枚にパックして描画負荷を下げる_27
    このようにビルドした時のファイルサイズが増えてしまいます。Resourcesフォルダに元画像は入れないようにしましょう。

    注意点②いつの間にかSpriteAtlasの枚数の増加に注意

    SpriteAtlasに画像を追加していると、あるときSpriteAtlasの枚数が増えてしまいます。
    【Unity】SpriteAtlasの使い方!Spriteを1枚にパックして描画負荷を下げる_28
    SpriteAtlasのInspectorウィンドウのPreview画面のプルダウンメニューで今の使用枚数をチェックできます。

    【Unity】SpriteAtlasの使い方!Spriteを1枚にパックして描画負荷を下げる_29
    「Max Texture Size」を超えた場合はSpriteAtlasが増えていく仕様なので、気をつけながら画像を追加していってください。とくに警告やエラーで教えてくれません。

    注意点③UIにTight Packing、Allow Rotationは禁止

    【Unity】SpriteAtlasの使い方!Spriteを1枚にパックして描画負荷を下げる_30
    前述の「→ Allow Rotation / Tight Packing」で解説しましたが、UIで使うSpriteAtlasに「Tight Packing」と「Allow Rotation」は使用禁止です。SpriteRendererでは正常に動作しますが、UIでは動作しません。

    SpriteAtlasのまとめ

    この記事ではSpriteAtlasについて解説しました。簡単に内容をまとめます。

    SpriteAtlasのまとめ

    ①SpriteAtlasとは複数の画像を1枚にまとめたアセット

    ②SpriteAtlasを使うことで描画パフォーマンスアップ

    ③Unity 2022.2以降はSprite Atlas V2が標準

    ④UIやSpriteRendererで使用される

    ⑤TightPackingはUIでは使用不可

    こんな感じです。

    スプライトはUIや2Dゲームを作るときに必ず登場します。SpriteAtlasを使うことで描画コストを下げ、パフォーマンスをアップします。設定も紹介したとおり簡単ですので、ぜひSpriteAtlasを使ってみてください。

    次の記事ではSpriteを使ってUIを作る方法を解説しています。UnityでUIを作ってみたい方はぜひ読んでみてください。

    この記事があなたのゲーム開発に少しでもお役に立てたら嬉しいです。

    SpriteAtlasと合わせて描画順も理解しよう

    SpriteAtlasを使いはじめると、Spriteの描画順 で悩む場面が増えてきます。

    オオバが執筆した 「Unity描画順の教科書」 では、CanvasやSortingOrder、Shaderまで、Unityの描画順 を基礎から体系的に解説しています。

    描画まわりの理解を一度整理しておきたい方は、ぜひ確認してみてください。

    Unity描画順の教科書
    Unityの描画順を体系的に学べる入門書。ゲーム開発中に登場するさまざまなオブジェクトの描画順を思ったとおりに制御してみ...
    詳しくはこちら
    Unity描画順の教科書

    記事の内容やUnityゲーム開発について、個別で相談したい 方は「オオバの公式LINE」からご連絡ください。

    いまなら期間限定で、Unity開発を加速させる 無料特典 も配布中です! → 公式LINEに登録して特典を受け取る

    最後まで読んでいただきありがとうございました!
    すばらしいSpriteAtlasライフをお過ごしください。

    オススメ記事
    検証環境