原创内容,转载请注明原文网址:http://homeqin.cn/a/wenzhangboke/jishutiandi/youxikaifa/2019/0309/408.html
常州游戏开发-Unity 客户端结构(四):资源管理器
资源管理器,就是加载资源用的
作用:
当一个项目非常庞大的时分,咱们不可能每次都手动去加载释放,这时分需要一个管理器来帮咱们实现并管理他们
//资源类
public class AssetInfo
{
//资源目标
private UnityEngine.Object _Object;
//资源类型
public Type AssetType { get; set; }
//途径
public string Path { get; set; }
//读取次数
public int RefCount { get; set; }
public bool IsLoaded
{
get
{
return null != _Object;
}
}
public UnityEngine.Object AssetObject
{
get
{
if (null == _Object)
{
_ResourcesLoad();
}
return _Object;
}
}
//协程加载
public IEnumerator GetCoroutineObject(Action<UnityEngine.Object> _loaded)
{
while(true)
{
yield return null;
if(!_Object)
{
_ResourcesLoad();
yield return null;
}
else
{
if (_loaded != null)
_loaded(_Object);
}
yield break;
}
}
//加载
private void _ResourcesLoad()
{
try
{
_Object = Resources.Load(Path);
if (!_Object)
Debug.Log("Resources load Failue : " + Path);
}
catch(Exception e)
{
Debug.Log(e.ToString());
}
}
//异步加载
public IEnumerator GetAsyncObject(Action<UnityEngine.Object> _loaded,Action<float> _progress = null)
{
if(null != _Object)
{
_loaded(_Object);
yield break;
}
ResourceRequest _resRequest = Resources.LoadAsync(Path);
while(_resRequest.isDone)
{
if (_progress != null)
_progress(_resRequest.progress);
yield return null;
}
_Object = _resRequest.asset;
if(null != _loaded)
{
_loaded(_Object);
}
yield return _resRequest;
}
}
//资源管理器
public class ResManager : Singleton<ResManager>
{
//已经加载的资源字典
private Dictionary<string, AssetInfo> dicAssetInfo = null;
public override void Init()
{
dicAssetInfo = new Dictionary<string, AssetInfo>();
}
//加载并生成目标 同步 协程 异步
#region Load Resources & Instantiate Object
public UnityEngine.Object LoadInstance(string _path)
{
UnityEngine.Object _obj = Load(_path);
return Instantiate(_obj);
}
public void LoadCoroutineInstance(string _path, Action<UnityEngine.Object> _loaded = null)
{
LoadCoroutine(_path, (_obj) => { Instantiate(_obj, _loaded); });
}
public void LoadAsyncInstance(string _path, Action<UnityEngine.Object> _loaded = null, Action<float> _progress = null)
{
LoadAsync(_path, (_obj) => { Instantiate(_obj, _loaded); }, _progress);
}
#endregion
//加载不生成目标
#region Load Resources
/// <summary>
/// Load the specified _path.
/// </summary>
/// <param name="_path">_path.</param>
public UnityEngine.Object Load(string _path)
{
AssetInfo _assetInfo = GetAssetInfo(_path);
if (null != _assetInfo)
return _assetInfo.AssetObject;
return null;
}
#endregion
//协程加载
#region Load Coroutine Resources
//_loaded为加载完成后回调
public void LoadCoroutine(string _path, Action<UnityEngine.Object> _loaded = null)
{
AssetInfo _assetInfo = GetAssetInfo(_path, _loaded);
if (null != _assetInfo)
CoroutineInstance.Instance.StartCoroutine(_assetInfo.GetCoroutineObject(_loaded));
}
#endregion
//异步加载
#region Load Async Resources
//_progress为进展回调
public void LoadAsync(string _path, Action<UnityEngine.Object> _loaded = null, Action<float> _progress = null)
{
AssetInfo _assetInfo = GetAssetInfo(_path, _loaded);
if (null != _assetInfo)
CoroutineInstance.Instance.StartCoroutine(_assetInfo.GetAsyncObject(_loaded, _progress));
}
#endregion
//获取资源和生成目标
#region GetAssetInfo & Instantiate Object
private AssetInfo GetAssetInfo(string _path,Action<UnityEngine.Object> _loaded = null)
{
if(string.IsNullOrEmpty(_path))
{
Debug.Log("Error: null _path");
if (_loaded != null)
_loaded(null);
}
AssetInfo _assetInfo = null;
if(!dicAssetInfo.TryGetValue(_path,out _assetInfo))
{
_assetInfo = new AssetInfo();
_assetInfo.Path = _path;
dicAssetInfo.Add(_path, _assetInfo);
}
_assetInfo.RefCount++;
return _assetInfo;
}
private UnityEngine.Object Instantiate(UnityEngine.Object _obj, Action<UnityEngine.Object> _loaded = null)
{
UnityEngine.Object _retObj = null;
if (null != _obj)
{
_retObj = MonoBehaviour.Instantiate(_obj);
if (null != _retObj)
{
if (null != _loaded)
{
_loaded(_retObj);
return null;
}
return _retObj;
}
else
{
Debug.LogError("Error: null Instantiate _retObj.");
}
}
else
{
Debug.LogError("Error: null Resources Load return _obj.");
}
return null;
}
#endregion
void Destroy()
{
Resources.UnloadUnusedAssets();
GC.Collect();
}
}
上篇:上一篇:常州手游开发培训-Unity3d资源管理分析
下篇:下一篇:常州手游开发-U3D客户端框架:UI框架