Unityで画像をAtlas化する(Unity 6 / URP対応)

対象: Unity 6(6000.x)、URP使用プロジェクト、2Dスプライト/UGUI/Addressables を扱う開発者。

ゴール: 複数画像(アイコン・ボタン・スプライト)を 1 枚のテクスチャにまとめて転送回数とドローコールを削減し、ビルドサイズと描画負荷を最適化する。


1. なぜAtlas化するのか

メリット

  • ドローコール削減:
    同一マテリアル + 同一テクスチャでバッチングが効く。
  • 転送回数削減:
    テクスチャ切替(SetTexture)を減らす。
  • 圧縮の一元管理:
    iOS/Android でのテクスチャ圧縮形式(ASTC/ETC2 など)を一括管理しやすい。
  • ロード制御:
    Addressables と組み合わせると場面ごとに最小限のアトラスだけを読む設計が可能。

注意点

  • にじみ/境界アーチファクト:
    パディング/エクストルード/ミップマップ設定を適切にしないと発生。
  • 巨大アトラスの無駄:
    使わない領域を抱えがち。シーン/画面単位で分割を検討。

必ず Atlas 化しなければならない、というわけではありません。状況によってメリットとコストのバランスが変わります。整理すると次の通りです。


Atlas 化を「必ずした方がいい」ケース

  • UI や 2D スプライトを大量に表示するアプリ/ゲーム→ ドローコール削減効果が大きい。
  • モバイル端末向けでパフォーマンスがシビアな場合→ テクスチャ切替の負荷が顕著に効く。
  • 画面単位で画像がまとまっている設計(例:インベントリ画面で共通アイコン多数)→ ロード・メモリ管理が簡単になる。
  • App Store / Google Play に出す予定がある→ ビルドサイズ削減・パフォーマンス最適化は審査やUXで評価されやすい。

Atlas 化が必須ではないケース

  • 小規模プロジェクト(数枚の画像しか使わない)→ 管理コストの方が大きい。
  • 動的に読み込む特殊な画像が多い(ユーザーが撮影する写真など)→ アトラス化できない。
  • プロトタイピングや学習段階→ まずは動くものを作るのを優先でOK。

実務的な結論

  • 商用リリースを目指す規模のプロジェクトなら「Atlas 化は必須に近い」
  • 学習や試作段階なら「後から入れてもいい」

「UIアイコン・ボタンが多く、スマホ向けで、継続運用を考えている」ケースでは Atlas 化は強く推奨です。

逆に、少数素材のデモであれば、今すぐ必須ではありません。


2. アトラスの種類と選択指針

用途推奨機能説明
2D Sprite / UGUI(Image, SpriteRenderer)Sprite Atlas v2Unity標準のスプライト用アトラス。通常はこれ一択。
3Dメッシュのマテリアル統合手動ベイク or 専用ツール(UV再配置)静的メッシュを 1 マテリアル化したいとき。
同解像度・同シェーダで多数バリエーションTexture2DArray“アトラス”ではないが、配列スロット切替で描画。用途が限定的。

本資料では Sprite Atlas v2 を中心に解説します。


3. 下準備(インポート設定)

各画像(PNG など)を Assets/Textures/UI/… などに配置し、Sprite (2D and UI) としてインポート。

  • Sprite Mode:
    Single / Multiple(スプライトシートなら Sprite Editor で切り分け)
  • Filter Mode:
    UIは多くが Bilinear、ドット絵は Point (no filter)
  • Compression:
    UI は可読性優先(Low~Normal / もしくは非圧縮)
  • sRGB (Color Texture):
    通常は ON

4. Sprite Atlas v2 を作成する(基本の 5 ステップ)

  1. アセット作成
    Project 上で Create > 2D > Sprite Atlas。
  2. 命名:
    画面・機能単位で分割(例)UI/Common.spriteatlas, UI/Inventory.spriteatlas。
  3. Include in Build を一旦 ON(Addressables を使う場合は後述)。
  4. Objects for Packing にスプライト(またはそのフォルダ)を ドラッグ&ドロップ
  5. 右上の Pack Preview → Pack でパッキング確認(必要に応じて Auto-Reload 有効)。

UGUI(Image)/SpriteRenderer は 個々の Sprite 参照を持つだけでOK。アトラスを直接参照しなくても、同アトラス内なら自動で 1 枚のテクスチャにまとまります。


5. Atlas の主要設定(推奨値の目安)

General

  • Max Texture Size:
    2048 〜 4096(モバイル UI は 2048 が無難)
  • Padding:
    4〜8 px(境界にじみ対策)
  • Enable Rotation:
    ON(空き最小化。ただし 9-slice には注意)
  • Tight Packing:
    ON(余白削減。ただし SDFフォントや 9-slice では OFF 推奨)
  • Read/Write Enabled:
    OFF(必要時のみ ON)
  • Generate Mip Maps:
    UIは通常 OFF(縮小ぼけ/にじみの原因)

Platform Overrides(iOS/Android)

  • iOS: 
    ASTC 6×6 or 8×8(視認性と容量のバランス)
  • Android: 
    ASTC が安定。古端末向けに ETC2 フォールバックを別ビルド/ABで考慮
  • Crunch Compression:
    UIではアーティファクトが出やすいので基本 OFF

Advanced(Artifacts対策)

  • Sprite Borders(9-slice) を使うスプライトは Tight Packing OFF を検討
  • Alpha is Transparency: ON(デフォルト)

6. 運用設計(分割と命名)

  • 画面単位: 例)UI/Home, UI/Inventory, UI/Paywall …
  • 共通資産: 例)UI/Common(共通ボタン/アイコン)
  • 季節イベント: 例)UI/Event2025_Summer

1 つのアトラスが巨大化(4096 でも入り切らない)する前に、機能/画面で分割。ロード制御(Addressables)と相性が良くなります。


7. Addressables と組み合わせる

方針

  • 画面遷移ごとに必要なアトラスだけをロード → メモリ節約

手順

  1. Atlas アセットの Include in Build を OFF
  2. 該当 Atlas を Addressable(Addressables Groups)に追加
  3. 画面開始前に Addressables.LoadAssetAsync<SpriteAtlas>(key) でプリロード。
  4. 画面終了時に Addressables.Release(atlas)

サンプルコード

using System.Threading.Tasks;
using UnityEngine;
using UnityEngine.U2D; // SpriteAtlas
using UnityEngine.AddressableAssets;

public static class AtlasLoader
{
    public static async Task<SpriteAtlas> LoadAsync(string key)
    {
        var handle = Addressables.LoadAssetAsync<SpriteAtlas>(key);
        return await handle.Task; // エラー処理は省略
    }
}

既にシーン内の Image/SpriteRenderer がその Atlas 内の Sprite を参照していれば、Atlas のロードが完了した時点で自動解決されます。


8. 旧式(Packing Tag)からの移行

  • SpriteImporter の Packing Tag はレガシー。新規は Sprite Atlas v2 を利用。
  • 既存プロジェクトで Packing Tag を使っている場合は、Atlas v2 を用意し、該当スプライトを Atlas に移し替え、Packing Tag を空にしていく。

9. アトラスの分割・バリアント

  • Variant Atlas: 元アトラスの縮小版などを用意可能。
    • 低解像度端末向けや小さい UI スケール用に検討。
  • 複数アトラスへの振り分けルール
    • 画面の同時表示範囲で 同時に必要になるセットを同じアトラスへ。
    • めったに同時に使わないならアトラスを分け、ロード/アンロードを制御。

10. UGUI / 2Dでの描画最適化メモ

  • 同じ マテリアル(Sprite/Default など) と 同アトラス で並べるとバッチングされやすい。
  • Mask/Outline/Shadow はマテリアル切替や追加描画を誘発。
  • キャンバスの再構築(Canvas rebuild)は高コスト。動的に頻繁に変える UI は別キャンバスへ。
  • Pixel Perfect を使う場合、縮小拡大でにじみやすい→ パディング広め + MipMap OFF。

11. よくあるアーチファクトと対策

症状典型原因対策
スプライトの縁がにじむ/透けるMipMap / フィルタ / パディング不足MipMap OFF, Padding 4〜8, Extrude 有効、Point または Bilinear
線が欠ける/途切れるTight Packing + 回転/トリムTight OFF、Rotation OFF、Sprite を矩形で準備
9-slice が崩れるTight/Rotation と競合9-slice 用は 別アトラスに分離
文字が滲むCrunch 圧縮UI では Crunch OFF、ASTC/ETC2のブロックサイズ見直し
端で色が回り込む周囲ピクセル不足画像側を 1〜2px 拡張描画(エクストルード)

12. 事前チェックリスト(導入前)

  • スプライトが Sprite (2D and UI) でインポートされている
  • Atlas を 画面/機能単位で分割する設計
  • Padding >= 4MipMap OFF(UI)
  • iOS/Android の プラットフォーム圧縮を設定
  • 9-slice 用素材は 別アトラス
  • Addressables でロード境界を設計(必要時)

13. 検証手順(効果を可視化)

  1. Frame Debugger を有効化 → SetPass/DrawCall の変化を確認。
  2. Profiler(Rendering) → Batches / SetPass Calls の減少を確認。
  3. Memory Profiler → 読み込まれているテクスチャ数とサイズを確認。

アトラス導入で Batches/SetPass が下がり、Texture数も減るのが理想。


14. トラブルシューティング

  • 参照しているのに別テクスチャ扱いになる
    • 画像が 別アトラスに入っている、もしくは Include in Build/Addressables の設定不整合。
    • 参照 Sprite が 同一インポート設定になっているか確認(sRGB 等の差異も影響する場合あり)。
  • ランタイムで Sprite が白四角
    • Atlas 未ロード(Addressables)。プリロード順を見直す。
    • シーン遷移時に Unload し過ぎていないか。
  • にじみが改善しない
    • MipMap 完全 OFF / Padding 増 / 画像側のエクストルード描画を検討。

15. 応用:ランタイム解決フック(Resources 流儀)

Addressables を使わない軽量ケース:

using UnityEngine;
using UnityEngine.U2D; // SpriteAtlas

public class AtlasBootstrap : MonoBehaviour
{
    void OnEnable()
    {
        SpriteAtlasManager.atlasRequested += OnAtlasRequested;
    }
    void OnDisable()
    {
        SpriteAtlasManager.atlasRequested -= OnAtlasRequested;
    }
    void OnAtlasRequested(string tag, System.Action<SpriteAtlas> action)
    {
        // Resources/SpriteAtlases/MyUI.spriteatlas を読み込む例
        var atlas = Resources.Load<SpriteAtlas>($"SpriteAtlases/{tag}");
        if (atlas != null) action(atlas);
    }
}

Atlas の Tag と Resources 内のパス命名を合わせると、未ロード時に自動ロードが可能。


16. まとめ

  • Unity の Sprite Atlas v2 を使えば、スプライト参照はそのままに 描画効率とメモリ管理を大幅に改善できる。
  • UI/画面単位での分割、Padding/MipMap/圧縮の正しい設定、Addressables との連携が鍵。
  • 導入後は Frame Debugger / Profiler で数値を確認し、効果を定量評価する。

付録 A: 推奨フォルダ構成(例)

Assets/
  Textures/
    UI/
      Common/
      Inventory/
      Paywall/
  Atlases/
    UI/
      Common.spriteatlas
      Inventory.spriteatlas
      Paywall.spriteatlas
  Resources/ (必要な場合のみ)
    SpriteAtlases/
      Common.spriteatlas

付録 B: 品質プリセット例(UI向け)

  • Max Size: 2048
  • Padding: 6
  • Rotation: ON
  • Tight: OFF(9-slice を含む場合)
  • MipMap: OFF
  • iOS: ASTC 6×6、Android: ASTC 8×8

訪問数 20 回, 今日の訪問数 20回

Unity

Posted by hidepon