유니티 소스코드

리소스 매니저 소스코드

서보훈 2025. 3. 27. 12:43

Resources 에서 불러오기를 당담하는 매니저

 

public class ResourceManager : PersistentSingleton<ResourceManager>
{
    //불러온 리소스를 저장
    private Dictionary<string,object> resourcePool = new Dictionary<string,object>();

    public T LoadResource<T>(string name, EMajorType majorType, ESubType subType = ESubType.None)
    {
        StringBuilder stringBuilder = new StringBuilder();

        T returnAsset;

        stringBuilder.Append(majorType);
        stringBuilder.Append(subType == ESubType.None ? "" : $"/{subType}");
        stringBuilder.Append($"/{name}");

        if (!resourcePool.ContainsKey(stringBuilder.ToString()))
        {
            var targetResource = Resources.Load(stringBuilder.ToString(), typeof(T));

            if(targetResource == null )
            {
                return default;
            }

            resourcePool.Add(stringBuilder.ToString(), targetResource);
        }

        returnAsset = (T)resourcePool[stringBuilder.ToString()];
        return returnAsset;
    }

    public List<T> LoadAllResources<T> (EMajorType majorType, ESubType subType = ESubType.None)
    {
        StringBuilder stringBuilder = new StringBuilder();

        stringBuilder.Append(majorType);
        stringBuilder.Append(subType == ESubType.None ? "" : $"/{subType}");

        List<T> returnResources = new List<T>();

        if (!resourcePool.ContainsKey(stringBuilder.ToString()))
        {
            List<string> keyList = new List<string>();

            object[] loaded = Resources.LoadAll(stringBuilder.ToString(), typeof(T));


            foreach (object loadedObj in loaded)
            {
                StringBuilder key = new StringBuilder();
                key.Append(stringBuilder.ToString());
                key.Append($"/");
                key.Append(loadedObj.ToString());
                key.Replace($" ({loadedObj.GetType()})", "");

                resourcePool.Add(key.ToString(), loadedObj);

                keyList.Add(key.ToString());
            }

            resourcePool.Add(stringBuilder.ToString(), keyList);
        }

        List<string> getKey = (List<string>)resourcePool[stringBuilder.ToString()];

        for(int i = 0; i < getKey.Count; i++)
        {
            returnResources.Add((T)resourcePool[getKey[i]]);
        }

        return returnResources;
    }
}

--- 비동기 방식

동기 방식 내용 추가할것

 

Enum의 경우, Resources 폴더의 하위 폴더에 맞추어서 추가해주기

public enum EMajorType
{
    Data,
    Prefab
}

public enum ESubType
{
    UI,
    Item,
    Character,
    None
}

 

'유니티 소스코드' 카테고리의 다른 글

SFM(유한상태기계) 소스코드  (0) 2025.03.26
싱글톤 패턴 소스코드  (0) 2025.03.24