Unity加载资源有两种方式:1.Resources.Load(). 2.AssetBundle前者属于同步加载,后者一般认为属于异步加载,Unity官方也只提供异步这种方式。(习惯按Ctrl + S
Unity加载资源有两种方式:1.Resources.Load(). 2.AssetBundle
前者属于同步加载,后者一般认为属于异步加载,Unity官方也只提供异步这种方式,其实也可以同步的哦。(习惯按Ctrl + S 好烦)
异步加载方式:
IEnumerator LoadAssets(string path)
{
WWW www = new WWW(path);
yield return www;
}
void StartLoad()
{
StartCoroutine(LoadAssets(path));
}
StartCoroutine在unity3d的帮助中叫做协程,意思就是启动一个辅助的线程。在C#中协程要定义为IEnumerator
(实现式接口)这个类型.它声明实现该接口的类就可以作为一个迭代器iterator。所以说属于异步加载
但是在开发项目前期使用Resources(同步)加载资源,到了后期项目需要做增量更新,那就得使用WWW类进行加载(听说还有其他非WWW加载方式,希望大家分享下),同步改成异步那可不是说改就能改的,很多逻辑都需要重新处理才行。其实使用WWW类进行加载并不一定是异步的,也可以处理成同步加载(也让我纠结一上午,浏览网页是突然想到可以使用IEnumerable试试,没想到成功了,哈哈(还是自己太懒,不想大面积改代码)),其实同学一看就明白,下面直接上代码:
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class LoadAsset
{
private string m_sPath = string.Empty;//资源路径
private WWW m_www = null;
private int m_iCountRetry = 5;//重复下载次数
public LoadAsset(string path)
{
m_sPath = path;
}
public UnityEngine.Object StarLoad()
{
UnityEngine.Object result = null;
while (result == null)
{
foreach (UnityEngine.Object obj in LoadWWW())
{
result = obj;
}
if (m_iCountRetry > 0)
{
if (result != null)
{
break;
}
m_iCountRetry--;
}
else
{
break;
}
}
DeInit();
return result;
}
public IEnumerable<UnityEngine.Object> LoadWWW()
{
m_www = new WWW(m_sPath);
yield return m_;
}
private void DeInit()
{
if(m_www != null)
{
m_();
}
m_www = null;
}
}
public class ResLoad
{
private static ResLoad instance = null;
public static ResLoad Instance
{
get
{
if (instance == null)
{
instance = new ResLoad();
}
return instance;
}
}
public UnityEngine.Object StarLoad(string path)
{
UnityEngine.Object obj = null;
LoadAsset asset = new LoadAsset(path);
obj = asset.StarLoad();
return obj;
}
public T StarLoad<T>(string path)
{
LoadAsset asset = new LoadAsset(path);
object obj = asset.StarLoad() as object;
return ((T)obj);
}
}
上面是我开发项目的源码,拷贝可以直接使用!是不是很简单,如有没说到的地方,,希望大家补充,多喷喷!
转载请说明输出:
|