项目用到的一个资源管理类

来源:互联网 发布:淘宝能买到a碟吗 编辑:程序博客网 时间:2024/06/06 00:04
//加载类型public enum LoadType{    Resources,}
//资源信息public class ResourcesInfo{    private Object mResourceObject;    public Object pResourceObject    {        get        {            return mResourceObject;        }    }    /// <summary>    /// 当前资源加载的协程对象(只用于记录当前协程对象)    /// </summary>    private Coroutine mCoroutine;    public Coroutine pCoroutine    {        get        {            return mCoroutine;        }        set        {            mCoroutine = value;        }    }    public void SetResourcesObject(Object varObject)    {        if (mResourceObject == null)        {            return;        }        mResourceObject = varObject;    }    private string mPathName;    public string pPathName    {        get        {            return mPathName;        }    }    private List<DownloadCallback> mDownloadDoneCallback = new List<DownloadCallback>();    public void AddCallback(DownloadCallback callback)    {        if (mDownloadDoneCallback == null || mDownloadDoneCallback.Contains(callback))        {            return;        }        mDownloadDoneCallback.Add(callback);    }    public void ExecuteCallback()    {        for (int i = 0; i < mDownloadDoneCallback.Count; i++)        {            DownloadCallback callback = mDownloadDoneCallback[i];            if (callback != null)            {                callback(mPathName, mResourceObject);            }        }        mDownloadDoneCallback.Clear();    }    public ResourcesInfo(string varPathName)    {        mPathName = varPathName;    }    public IEnumerator ResourcesDownloads()    {        ResourceRequest request = Resources.LoadAsync(mPathName);        yield return request;        if (request.isDone)        {            mResourceObject = request.asset;            ResourcesManager.GetInstance().RemoveCoroutineQueue(this);        }        ExecuteCallback();    }    public void Unload()    {        if (mResourceObject == null)        {            return;        }        Resources.UnloadAsset(mResourceObject);        mResourceObject = null;    }}



//资源加载回调的委托public delegate void DownloadCallback(string varPathName, Object varObject);


//资源管理类public class ResourcesManager : MonoBehaviour{    private static ResourcesManager Instance;    public static ResourcesManager GetInstance()    {        if (Instance == null)        {            GameObject obj = new GameObject("ResourcesManager");            Instance = obj.AddComponent<ResourcesManager>();            GameObject.DontDestroyOnLoad(obj);        }        return Instance;    }    /// <summary>    /// 最大并发加载协程数量    /// </summary>    private const int MaxStartCoroutine = 100;    List<string> mDownloadsKey = new List<string>();    /// <summary>    /// 正在排队下载的资源队列    /// </summary>    List<ResourcesInfo> mDownloadsValue = new List<ResourcesInfo>();    /// <summary>    /// 当前正在加载的资源    /// </summary>    Dictionary<string, ResourcesInfo> mIsDownloadsQueue = new Dictionary<string, ResourcesInfo>();    /// <summary>    /// 已加载完成的资源    /// </summary>    Dictionary<string, ResourcesInfo> mDownloadsDone = new Dictionary<string, ResourcesInfo>();    /// <summary>    /// 当前已开启协程下载集合    /// </summary>    Dictionary<string, ResourcesInfo> mCoroutineQueue = new Dictionary<string, ResourcesInfo>(MaxStartCoroutine);    private LoadType mLoadType = LoadType.Resources;    public Dictionary<string, ResourcesInfo> pCoroutineQueue    {        get        {            return mCoroutineQueue;        }    }    public LoadType pLoadType    {        get        {            return mLoadType;        }        set        {            mLoadType = value;        }    }    /// <summary>    /// 释放资源    /// </summary>    public void Unload()    {        Dictionary<string, ResourcesInfo>.Enumerator enumerator = mDownloadsDone.GetEnumerator();        for (int i = 0; i < mDownloadsDone.Count; i++)        {            enumerator.Current.Value.Unload();        }        mDownloadsDone.Clear();        mCoroutineQueue.Clear();        //清理内存        Resources.UnloadUnusedAssets();        System.GC.Collect();    }    public void AddResourceDownload(string varPathName, DownloadCallback callback)    {        //转成小写        varPathName = varPathName.ToLower();        if (mDownloadsDone.ContainsKey(varPathName))        {            ResourcesInfo tmp = mDownloadsDone[varPathName];            tmp.AddCallback(callback);            tmp.ExecuteCallback();            return;        }        if (mDownloadsKey.Contains(varPathName))        {            ResourcesInfo tmp = FindResourceInfo(varPathName);            if (tmp!=null)            {                tmp.AddCallback(callback);            }            return;        }        if (mIsDownloadsQueue.ContainsKey(varPathName))        {            mIsDownloadsQueue[varPathName].AddCallback(callback);            return;        }        if (mCoroutineQueue.ContainsKey(varPathName))        {            mCoroutineQueue[varPathName].AddCallback(callback);            return;        }        mDownloadsKey.Add(varPathName);        ResourcesInfo info = new ResourcesInfo(varPathName);        info.AddCallback(callback);        mDownloadsValue.Add(info);    }    ResourcesInfo FindResourceInfo(string varPathName)    {        for (int i = 0; i < mDownloadsValue.Count; i++)        {            if (mDownloadsValue[i].pPathName.Equals(varPathName))            {                return mDownloadsValue[i];            }                    }        return null;    }    /// <summary>    /// 移除一个协程并把加载完成的资源加入进已完成的队列集合中    /// </summary>    /// <param name="var"></param>    public void RemoveCoroutineQueue(ResourcesInfo varInfo)    {        if (varInfo == null)        {            return;        }        if (mDownloadsDone.ContainsKey(varInfo.pPathName))        {            return;        }        mCoroutineQueue.Remove(varInfo.pPathName);        mDownloadsDone.Add(varInfo.pPathName, varInfo);    }    void Update()    {        if (pCoroutineQueue.Count == MaxStartCoroutine)        {            return;        }        else if (pCoroutineQueue.Count <= MaxStartCoroutine && mDownloadsValue.Count > 0)        {            for (int i = 0; i < MaxStartCoroutine; i++)            {                if (i > mDownloadsKey.Count)                {                    break;                }                ResourcesInfo info = mDownloadsValue[0];                if (info != null)                {                    mIsDownloadsQueue.Add(info.pPathName, info);                }                mDownloadsKey.RemoveAt(0);                mDownloadsValue.RemoveAt(0);            }        }        if (mCoroutineQueue.Count > MaxStartCoroutine)        {            return;        }        Dictionary<string, ResourcesInfo>.Enumerator enumer = mIsDownloadsQueue.GetEnumerator();        for (int i = 0; i < mIsDownloadsQueue.Count; i++)        {            enumer.MoveNext();            ResourcesInfo info = enumer.Current.Value;            if (info == null || string.IsNullOrEmpty(info.pPathName))            {                mIsDownloadsQueue.Remove(enumer.Current.Key);                continue;            }            Coroutine tmp = null;            switch (mLoadType)            {                case LoadType.Resources:                    tmp = StartCoroutine(info.ResourcesDownloads());                    break;            }            mIsDownloadsQueue.Remove(enumer.Current.Key);            info.pCoroutine = tmp;            mCoroutineQueue.Add(info.pPathName, info);        }    }}


//调用示例        DownloadCallback callback = (string filePathName, Object obj) =>        {            TextAsset asset = obj as TextAsset;            if (asset == null)            {                return;            }            //设置语言            Localization.Load(asset);        };        ResourcesManager.GetInstance().AddResourceDownload(languagePath, callback);