unityでいってみよう!

unityがチョットワカル位の人のブログ

Unity2020でのLegacy Sprite Packerについて

はじめに

Legacy Sprite Packerに関して、Unity2020.3のマニュアルには下記のような記載があります。

Please note that Sprite Packer is deprecated for Unity 2020.1 and newer, and will no longer be available as an option from Sprite Packer Modes. Existing Projects already using Sprite Packer will still be able to continue using it, however any new Project created in 2020.1 onwards will default to the Sprite Atlas system when packing Textures.

これを日本語で箇条書きにすると下記のようになります。

  • Sprite PackerはUnity2020.1以降で非推奨となった
  • Sprite Packer Modeはオプションとして利用出来なくなる
  • Sprite Packerを利用している既存のプロジェクトは引き続き使用可能
  • Unity2020.1以降で作成された新規プロジェクトではテクスチャパックをする際にデフォルトでSprite Atlas Systemが使用される

これを見た時、「Unity2020ではLegacy Sprite Packerは非推奨となるが、それ以前のUnityバージョンで作成したLegacy Sprite Packerを利用しているプロジェクトでは、引き続きLegacy Sprite Packerが使用出来る」と読み取りましたが、現実は違いました。

結論

結論から述べます。

Unity2020.1以降でも、それ以前のバージョンのUnityEditor上で設定したLegacy Sprite Packerのデータを使用可能ですが、Packing Tagが編集不可能である為、Legacy Sprite Packerで新たにAtlasを生成することや構成を変更することは出来ません。 また、AssetBundleにLegacy Sprite Packerで生成されたSpriteAtlasTextureが含まれている場合、AssetBundleのリビルドが発生した段階でそのSpriteAtlasTextureはAssetBundleから削除されます。

文章の

Existing Projects already using Sprite Packer will still be able to continue using it,

この部分がミスリードを誘っているのですが、ここでいうSprite PackerはLegacySpritePackerという機能を指している訳ではなく、LegacySpritePackerで作成したSpriteAtlasTextureを指しているようです。 確かに、UnityがJavaScriptやBooをdeprecationとした時も、UnityEditor上で新たにJavaScriptやBooが生成することが出来なくなったが、既存のファイルは使用出来たので、今回の挙動も筋は通っているよにも見えます。

しかしながら、Unity2020.3のSpritePackerModeのマニュアルでは未だにLegacySpritePackerが使えるかのように記載されていますがこれは完全に間違いでしょう。

f:id:kimukats:20210908123851p:plain

検証

それでは、検証を進めていきます。

初めにUnity2019.4で作成したLegacy Sprite Packerを使用したProjectをUnity2020.2で開いて、Project Settingsを確認するとSprite Packing ModeからLegacy Sprite Packerが無くなっていることを確認出来ます。

f:id:kimukats:20210908124706p:plain
Sprite Packing Modeの選択肢からLegacy Sprite Packerが消えている

次に、Sprite Assetを確認するとPacking Tagの項目は存在しますが、編集出来なくなっていることが分かります。

f:id:kimukats:20210908125402p:plain
Packing Tagがグレーアウト

また、LibraryフォルダにあるAtlasCacheフォルダを削除するとそれ以降AtlasCacheフォルダが生成されないため、Atlasを生成することはできません。

最後にAssetBundleからSpriteを読み込んで表示を行ってみます。 2019で作成したAssetBundleの中身を確認してみると、SpriteとSpriteAtlasTextureの両方が含まれていることが確認できます。

f:id:kimukats:20210908130358p:plain

AssetBundleからSpriteを読み込むコードはこんな感じです。

public class LoadAssetBundle : MonoBehaviour
{
    [SerializeField] SpriteRenderer spriteRenderer;
    [SerializeField] string assetName;


    // Start is called before the first frame update
    void Start()
    {
        var ab = AB.Load("onepiece");
        if (ab != null)
        {
            spriteRenderer.sprite = ab.LoadAsset<Sprite>(assetName);
        }
    }    
}

このコードを実行してみます。

f:id:kimukats:20210908133006p:plain

表示できました。 UnityEditorのPlayMode及びAndroid実機の双方で表示できることを確認しています。 これは、現時点ではLegacy Sprite Packerで生成したSprite Atlas Textureが使用してSpriteを表示することが出来ることを意味します。

最後にUnity2020でAssetBundleのビルドを実行し再びAssetBundleの中身を確認します。

f:id:kimukats:20210908131215p:plain

AssetBundleからSpriteAtlasTextureが消え去り、Spriteと対になった個別のTextureが追加されていることが分かります。 この構成でも実行するとSpriteは表示されますがSpriteAtlasTextureではなく、個別にTextureをロードすることになる訳です。

最後に

ちなみにUpgrade Guide 2020LTSによると

All Asset bundle hashes are different so all bundles are built

とあります。つまり、AssetBundleのHashが変わったので、Unity2020へ移行すると全てのAssetBundleがビルドの対象になるようです。 AssetBundleの温存作戦も無理のようです。

Legacy Sprite Packerを使用していたProjectをUnity2020.1以降にマイグレーションする場合、Legacy Sprite Packerはスパッと諦めてSprite Atlasへ移行しましょう。 その場合、Unity2020へマイグレーションする前に、Legacy Sprite PackerからSprite Atlasへの移行作業を先に行った方が問題の切り分けが楽だと思います。