コガネブログ

平日更新を目標に Unity や C#、Visual Studio、ReSharper などのゲーム開発アレコレを書いていきます

【Unity】SpriteAtlas.GetSprite はスプライトの参照を返すのではなく複製するのでメモリに注意

概要

using UnityEngine;
using UnityEngine.U2D;

public class Example : MonoBehaviour
{
    public SpriteAtlas m_atlas;

    private void Update()
    {
        m_atlas.GetSprite( "goal_01" );
    }
}

例えば上記のように Update 関数で毎フレーム
SpriteAtlas.GetSprite を実行するスクリプトを作成した場合、

f:id:baba_s:20180914105126g:plain

Profiler の「Total Objects in Scene」が凄い勢いで増えていくのがわかります

f:id:baba_s:20180914104920p:plain

Profiler の Detailed で「Scene Memory」を見てみると
同名のスプライトが大量に複製されることがわかります

シーンを遷移したり Resources.UnloadUnusedAssets を実行したりすれば
すべて解放されますが、もしも開発中のゲームが強制終了するなどあった場合は、
SpriteAtlas.GetSprite の使用方法を見直したほうが良いかもしれません