Unity3D游戏开发框架-资源管理类ResourceManage
新建文件夹:ResMgr。接着新建三个C#脚本。代码如下:
IResLoadListener.cs
AssetInfo.cs
ResMgr.cs
using UnityEngine;
using System.Collections; /// <summary>
/// 资源加载回调
/// </summary>
public interface IResLoadListener
{
void Finish(object asset); void Failure();
}
using System;
using UnityEngine;
using System.Collections;
using System.Collections.Generic; /// <summary>
/// 资源信息
/// </summary>
public class AssetInfo
{
/// <summary>
/// 资源
/// </summary>
public object asset; /// <summary>
/// 是否常驻内存
/// </summary>
public bool isKeepInMemory; /// <summary>
/// 资源堆栈数量
/// </summary>
public int stackCount = ;
} /// <summary>
/// 资源加载信息
/// </summary>
public class RequestInfo
{
/// <summary>
/// 资源反馈信息
/// </summary>
public ResourceRequest request; /// <summary>
/// 是否常驻内存
/// </summary>
public bool isKeepInMemory; /// <summary>
/// 加载完成之后的回调
/// </summary>
public List<IResLoadListener> linsteners; public void AddListener(IResLoadListener listener)
{
if (linsteners == null)
{
linsteners = new List<IResLoadListener>() { listener };
}
else
{
if (!linsteners.Contains(listener))
{
linsteners.Add(listener);
}
}
} /// <summary>
/// 资源名称
/// </summary>
public string assetName; public string assetFullName
{
get
{
return ResMgr.Instance.GetFileFullName(assetName);
}
} /// <summary>
/// 资源类型
/// </summary>
public Type type; /// <summary>
/// 资源是否加载完成
/// </summary>
public bool IsDone
{
get
{
return (request != null && request.isDone);
}
} /// <summary>
/// 加载到的资源
/// </summary>
public object Asset
{
get
{
return request != null ? request.asset : null;
}
} public void LoadAsync()
{
request = Resources.LoadAsync(assetFullName, type);
}
}
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System;
using System.IO; public class ResMgr : EventNode,IEventListener
{
private Dictionary<string, string> mAssetPathDic = new Dictionary<string, string>();
public string GetFileFullName(string assetName)
{
if (mAssetPathDic.Count == )
{
UnityEngine.TextAsset tex = Resources.Load<TextAsset>("res");
StringReader sr = new StringReader(tex.text);
string fileName = sr.ReadLine();
while (fileName != null)
{
Debug.Log("fileName =" + fileName);
string [] ss = fileName.Split('=');
mAssetPathDic.Add(ss[], ss[]);
fileName = sr.ReadLine();
}
}
return assetName = mAssetPathDic[assetName] + "/" + assetName;
}
/// <summary>
/// 所有资源字典
/// </summary>
private Dictionary<string, AssetInfo> mDicAaaet = new Dictionary<string, AssetInfo>(); /// <summary>
/// CPU 个数
/// </summary>
private int mProcessorCount = ; private static ResMgr mInstance;
public static ResMgr Instance
{
get
{
return mInstance;
}
} // Awake is called when the script instance is being loaded.
void Awake()
{
mInstance = this;
DontDestroyOnLoad(this.gameObject);
AttachEventListener(EventDef.ResLoadFinish, this);
mProcessorCount = SystemInfo.processorCount > && SystemInfo.processorCount <= ? SystemInfo.processorCount : ;
} void OnDestroy()
{
if (Instance != null)
{
Instance.DetachEventListener(EventDef.ResLoadFinish, this);
}
} /// <summary>
/// 正在加载的列表
/// </summary>
public List<RequestInfo> mInLoads = new List<RequestInfo>(); /// <summary>
/// 等待加载的列表
/// </summary>
public Queue<RequestInfo> mWaitting = new Queue<RequestInfo>(); /// <summary>
/// 资源加载堆栈
/// </summary>
public Stack<List<string>> mAssetStack = new Stack<List<string>>(); #region 加载资源
public void Load(string assetName, IResLoadListener listener, Type type = null, bool isKeepInMemory = false, bool isAsync = true)
{
if (mDicAaaet.ContainsKey(assetName))
{
listener.Finish(mDicAaaet[assetName]);
return;
}
if (isAsync)
{
LoadAsync(assetName, listener,isKeepInMemory,type);
}
}
#endregion #region 异步Res加载
private void LoadAsync(string assetName, IResLoadListener listener,bool isKeepInMemory,Type type)
{
for (int i = ; i < mInLoads.Count; i++)
{
if (mInLoads[i].assetName == assetName)
{
mInLoads[i].AddListener(listener);
return;
}
} foreach(RequestInfo info in mWaitting)
{
if (info.assetName == assetName)
{
info.AddListener(listener);
return;
}
} RequestInfo requestInfo = new RequestInfo();
requestInfo.assetName = assetName;
requestInfo.AddListener(listener);
requestInfo.isKeepInMemory = isKeepInMemory;
requestInfo.type = type == null ? typeof(GameObject) : type;
mWaitting.Enqueue(requestInfo);
}
#endregion #region 资源处理 /// <summary>
/// 从资源字典中取得一个资源
/// </summary>
/// <param name="assetName">资源名称</param>
/// <returns></returns>
public AssetInfo GetAsset(string assetName)
{
AssetInfo info = null;
mDicAaaet.TryGetValue(assetName,out info);
return info;
} /// <summary>
/// 释放一个资源
/// </summary>
/// <param name="assetName">资源名称</param>
public void ReleaseAsset(string assetName)
{
AssetInfo info = null;
mDicAaaet.TryGetValue(assetName, out info); if (info != null && !info.isKeepInMemory)
{
mDicAaaet.Remove(assetName);
}
} /// <summary>
/// 修改资源是否常驻内存
/// </summary>
/// <param name="assetName">资源名称</param>
/// <param name="IsKeepInMemory">是否常驻内存</param>
public void IsKeepInMemory(string assetName,bool IsKeepInMemory)
{
AssetInfo info = null;
mDicAaaet.TryGetValue(assetName, out info); if (info != null)
{
info.isKeepInMemory = IsKeepInMemory;
}
}
#endregion #region 资源释放以及监听 /// <summary>
/// 把资源压入顶层栈内
/// </summary>
/// <param name="assetName">资源名称</param>
public void AddAssetToName(string assetName)
{
if (mAssetStack.Count == )
{
mAssetStack.Push(new List<string>() { assetName });
} List <string> list = mAssetStack.Peek();
list.Add(assetName);
} /// <summary>
/// 开始让资源入栈
/// </summary>
public void PushAssetStack()
{
List<string> list = new List<string>();
foreach(KeyValuePair<string,AssetInfo> info in mDicAaaet)
{
info.Value.stackCount++;
list.Add(info.Key);
} mAssetStack.Push(list);
} /// <summary>
/// 释放栈内资源
/// </summary>
public void PopAssetStack()
{
if (mAssetStack.Count == ) return; List<string> list = mAssetStack.Pop();
List<string> removeList = new List<string>();
AssetInfo info = null;
for (int i = ; i < list.Count;i++ )
{
if (mDicAaaet.TryGetValue(list[i],out info))
{
info.stackCount--;
if (info.stackCount < && !info.isKeepInMemory)
{
removeList.Add(list[i]);
}
}
}
for (int i = ; i < removeList.Count;i++ )
{
if (mDicAaaet.ContainsKey(removeList[i]))
mDicAaaet.Remove(removeList[i]);
} GC();
} /// <summary>
/// 释放
/// </summary>
public void GC()
{
Resources.UnloadUnusedAssets();
System.GC.Collect();
} #endregion void Update()
{
if (mInLoads.Count > )
{
for (int i = mInLoads.Count - ; i >= ; i--)
{
if (mInLoads[i].IsDone)
{
RequestInfo info = mInLoads[i];
SendEvent(EventDef.ResLoadFinish, info);
mInLoads.RemoveAt(i);
}
}
} while (mInLoads.Count < mProcessorCount && mWaitting.Count > )
{
RequestInfo info = mWaitting.Dequeue();
mInLoads.Add(info);
info.LoadAsync();
}
} public bool HandleEvent(int id, object param1, object param2)
{
switch (id)
{
case EventDef.ResLoadFinish:
RequestInfo info = param1 as RequestInfo;
if (info != null)
{
if (info.Asset != null)
{
AssetInfo asset = new AssetInfo();
asset.isKeepInMemory = info.isKeepInMemory;
asset.asset = info.Asset;
if (!mDicAaaet.ContainsKey(info.assetName))
{
mDicAaaet.Add(info.assetName, asset);
} for (int i = ; i < info.linsteners.Count;i++ )
{
if (info.linsteners[i] != null)
{
info.linsteners[i].Finish(info.Asset);
}
}
AddAssetToName(info.assetName);
}
}
else
{
for (int i = ; i < info.linsteners.Count; i++)
{
if (info.linsteners[i] != null)
{
info.linsteners[i].Failure();
}
}
}
return false;
}
return false;
} public int EventPriority()
{
return ;
}
}
原文链接:http://blog.csdn.net/u013108312/article/details/52351850
Unity3D游戏开发框架-资源管理类ResourceManage的更多相关文章
- CosmosEngine - Unity3D /2D 轻量级游戏开发框架
CosmosEngine https://github.com/mr-kelly/CosmosEngine 快速入门 简介 特性 约定 整体架构图 使用经验 工作流 未来功能 快速入门 1.将NGUI ...
- 【Unity3D】Unity3D之 注册表动态存取游戏存档——PlayerPrefs类
[Unity3D]Unity3D之 注册表动态存取游戏存档--PlayerPrefs类 1.Unity3D提供了一个用于本地持久化保存与读取的类--PlayerPrefs.工作原理非常简单,以键值对的 ...
- Unity3d Platformer Pro 2D游戏开发框架使用教程
前言 Platformer Pro框架是Unity3d AssetStore上一个非常强大和受欢迎的2d游戏开发框架,这个教程的大部分翻译于官方文档,一部分是工作总结,还有一部分是视频教程文档化.这个 ...
- Unity3D游戏开发初探—1.跨平台的游戏引擎让.NET程序员新生
一.Unity3D平台简介 Unity是由Unity Technologies开发的一个让轻松创建诸如三维视频游戏.建筑可视化.实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的 ...
- Unity3D游戏开发初探—2.初步了解3D模型基础
一.什么是3D模型? 1.1 3D模型概述 简而言之,3D模型就是三维的.立体的模型,D是英文Dimensions的缩写. 3D模型也可以说是用3Ds MAX建造的立体模型,包括各种建筑.人物.植被. ...
- IOS 2D游戏开发框架 SpriteKit
最近发现Xcode自带的2D游戏开发框架SpriteKit可以直接引入到APP中进行混合开发,这就是说可以开发出既带业务应用又带游戏的苹果APP,咋怎么觉得这是一个自己的小发现....呵呵....., ...
- 将Unity3D游戏移植到Android平台上
将Unity3D游戏移植到Android平台是一件很容易的事情,只需要在File->Build Settings中选择Android平台,然后点击Switch Platform并Build出ap ...
- Unity3D游戏开发从零单排(四) - 制作一个iOS游戏
提要 此篇是一个国外教程的翻译,尽管有点老,可是适合新手入门. 自己去写代码.debug,布置场景,能够收获到非常多.游戏邦上已经有前面两部分的译文,这里翻译的是游戏的最后一个部分. 欢迎回来 在第一 ...
- [Unity3D]Unity3D游戏开发之飞机大战项目解说
大家好,我是秦元培,欢迎大家继续关注我的博客,我的博客地址是blog.csdn.net/qinyuanpei. 首先感谢大家对我博客的关注,今天我想和大家分享的是一个飞机大战的项目.这是一个比較综合的 ...
随机推荐
- java项目中文件含义
1. java项目 .project:是工程构建配置文件 .classpath:保存的是项目所用的外部引用包的路径 .settings:记录项目配置变化的记录文件夹 src:sourcefolder项 ...
- Objects类的静态方法
提供了几个静态方法,比如进行对象之间的比较等,而又因为Object是任何对象的超类,因为每个对象都可以调用这几个方法. 1.equals方法 可以防止空指针异常 String s1 = null; S ...
- GBK 字符集
什么是 GBK ? 中文名 汉字编码字符集 外文名 Chinese Internal Code Specification 全 称 <汉字内码扩展规范> GBK编码,是对GB2312 ...
- jquery 禁止滚动条滚动,并且滚动条不消失,页面大小不闪动
一,禁止滚动,滚动条不消失,页面大小不闪动 //禁止滚动条滚动 function unScroll() { var top = $(document).scrollTop(); $(document) ...
- 十八、Linux 进程与信号---进程介绍
18.1 进程的概念 程序:程序(program)是存放再磁盘文件中的可执行文件 进程 程序的执行实例被称为进程(process) 一个程序的执行实例可能由多个 进程具有独立的权限和职责.如果系统中某 ...
- UIScrollView嵌套的完美解决方案
UIScrollView嵌套的完美解决方案 做iOS开发,不可避免的会遇到UIScrollView的嵌套问题,之前也曾遇到过,吭哧吭哧做完了,效果不理想,和产品大战好几回合,就那样了.不可避免的,又一 ...
- matplotlib-形状
需要 import matplotlib.patches as mp import numpy as np import matplotlib.pyplot as plt import matpl ...
- vue安装教程总结
转载:https://blog.csdn.net/sunny1660/article/details/78326548 简介: vue.js是一套构建用户界面的渐进式框架.比较简洁,用于解 ...
- Java SE之正则表达式一:概述
正则表达式 概念 定义:符合一定规则的表达式 作用:用于专门操作字符串 特点:用于一些特定的符号表示代码的操作,这样就简化了长篇的程序代码 好处:可以简化对字符串的复杂操作 弊端:符号定义越多,正则越 ...
- luogu P4183 [USACO18JAN]Cow at Large P
传送门 首先考虑N^2做法,每次从一个点出发,如果到达一个点,然后到达这个点的时间\(\le\)离这个点最近的叶子距离\(di_x\),那么答案+1,否则继续找点 这个暴力很不好优化.可以这样认为,如 ...