본문 바로가기
개발/Unity

Unity) 스프라이트 아틀라스 매니져 (SpriteAtlas Manager)

by 테샤르 2022. 1. 23.

스프라이트 아틀라스 매니져 (SpriteAtlas Manager)

 

 

Unity 에서 Sprite Altas를 런타임중에 로드 및 관리하는 코드로 UnityEngine.U2D에 포함되어있다.

key를 기반으로 처리하는 형태이고 다른 형식으로도 가능하다.

public class SpriteAtlasManager : SingletonMono<SpriteAtlasManager>
{

    private Dictionary<string, SpriteAtlas> SpriteAtlases = new Dictionary<string, SpriteAtlas>();

    void Start()
    {
        SpriteAtlasManager.atlasRequested += RequestAtlas;
    }

    void OnApplicationQuit()
    {
        SpriteAtlasManager.atlasRequested -= RequestAtlas;
    }
  
    public void RequestAtlas(string _key, System.Action<SpriteAtlas> callback)
    {
        bool exist = ExistSpriteAtlas(_key);
        if (false == exist)
        {
            var result = Resources.Load<SpriteAtlas>(_key);
            if (result == null)
            {
                Debug.LogError($"[SpriteAtlas]  Load Error ::{_key} !! ");
                return;
            }
            SpriteAtlases.Add(_key, result);
        }

        callback(GetSpriteAtlas(_key));
    }

    private bool ExistSpriteAtlas(string _key)
    {
        if(SpriteAtlases == null)
        {
            Debug.LogError($"[SpriteAtlas]  ExistSpriteAtlas Initalize Error  !! ");
            return false;
        }

        return SpriteAtlases.ContainsKey(_key);
    }

    private SpriteAtlas GetSpriteAtlas(string _key)
    {
        if (false == ExistSpriteAtlas(_key))
            return null;

        SpriteAtlases.TryGetValue(_key, out SpriteAtlas returnValue);

        return returnValue;
    }
}
반응형

해당 Singleton Mono 클래스가 Start 되면 SpriteAtlasManager가 atlasRequested 콜백을 수신해서 Sprite가 Atlas에 등록할때까지 표시되지 않고 트리거되는 순간 이벤트를 확인할수 있다.

   SpriteAtlasManager.Instance.RequestAtlas("SpriteAtlas/BackGroundAtlas", (result ) => {
            if(result!=null)
                Debug.LogVerb($"[SpriteAtlas] {result.name}");
        });

필요한 시기에 (런타임 상황) SpriteAltas를 로드해서 사용하면 된다. 

실제 리턴되는 값은 SpriteAtlas로  result.GetSprite("이름") 을 통해서 스프라이트를 가져올수 있다.

 

대체적으로 SpriteAtlas를 런타임(RunTime)에서 로드해서 재사용하는 과정 또는 Addressable 에서 많이 사용 한다.

 

Unity SpriteAtlasManager : [ 링크 ]

 

Unity - Scripting API: SpriteAtlasManager

A Sprite can be loaded without referencing any Sprite Atlas, thus having no texture. It will be invisible until the user registers an atlas to the Sprite by listening to the SpriteAtlasManager.atlasRequested callback. When triggered, it will pass in the at

docs.unity3d.com

Unity SpriteAtlasManager.atlasRequested : [ 링크 ]

 

Unity - Scripting API: U2D.SpriteAtlasManager.atlasRequested

This usually means the sprite was packed to an atlas which is not included in build This callback does not expect an immediate response from the user. Instead, it passes on a System.Action. The user can load the atlas object later and use this System.Actio

docs.unity3d.com

 

 

★☆☆☆☆

 

반응형

댓글