项目用到的一个资源管理类
来源:互联网 发布:淘宝能买到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);
阅读全文
1 0
- 项目用到的一个资源管理类
- 一个项目用到的sql语句
- Spring入门--创建一个简单的用到Spring项目
- android项目用到的公共类方法
- 项目用到的窗口管理类
- 项目资源管理
- 项目用到的sql
- 项目用到的技术
- 项目用到的开源库
- 项目用到的技术
- 一个我现在用到的Hibernate类
- 一个我现在用到的Hibernate类
- 一个常常用到的管理类
- 用到的一个json
- 项目用到的自定义标签
- 项目笔记用到的链接
- 项目用到的分支总汇
- 自己项目用到的gradle
- 机器学习实战笔记4
- 1015. 德才论 (25)
- BZOJ 3730 震波
- 【NOIP提高组模拟A组8.15】膜法师 (Standard IO)
- 学生管理系统总结
- 项目用到的一个资源管理类
- redis数据类型
- 阿里内推一面记录
- POJ 3267 The Cow Lexicon (DP)
- hdu1165
- 区间+状压 [Haoi2016]字符合并
- 拓扑排序入门
- 杭电1069 Monkey and Banana
- sum of all integer numbers