Unity程序基础框架(五) 资源加载模块
ProjectBase中新建一个目录Res,再里面新建一个脚本——ResMgr.cs
需要注意的是,异步加载中,调用异步加载后,物体并没有被加载,需要等n帧才会被加载,所以我们不能直接返回物体,而是在方法中将物体传出去。
//资源加载模块
public class ResMgr : BaseManager<ResMgr>
{
//同步加载资源
public T Load<T>(string name) where T:Object{
T res = Resources.Load<T>(name); ;
//如果对象是一个GameObject类型的,我把它实例化后,再返回出去直接使用。
if (res is GameObject)
return GameObject.Instantiate(res);
else //else情况示例:TextAsset、AudioClip
return res;
}
//异步加载资源
public void LoadAsync<T>(string name,UnityAction<T> callback) where T:Object
{
//开启异步加载的协程
MonoMgr.GetInstance().StartCoroutine(ReallyLoadAsync<T>(name,callback));
}
private IEnumerator ReallyLoadAsync<T>(string name,UnityAction<T> callback) where T:Object{
ResourceRequest r=Resources.LoadAsync<T>(name);
yield return r;
if (r.asset is GameObject)
{
//实例化一下再传给方法
callback(GameObject.Instantiate(r.asset) as T);
}
else {
//直接传给方法
callback(r.asset as T);
}
}
}
ResTest测试脚本,挂载到场景中。
public class ResTest : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
if (Input.GetMouseButtonDown(0))
{
var obj= ResMgr.GetInstance().Load<GameObject>("Prefabs/Capsule");
obj.transform.localScale *= 2;
Debug.Log("资源加载成功!"+obj.name);
}
if (Input.GetMouseButtonDown(1))
{
ResMgr.GetInstance().LoadAsync<GameObject>("Prefabs/Capsule",(obj)=> {
obj.transform.localScale *= 2;
Debug.Log("资源加载成功!" + obj.name);
});
Debug.Log("没我啥事情!" );
}
}
}
为了方便,我们还可以直接使用Lambda表达式来方便书写
private void Update()
{
if (Input.GetMouseButtonDown(1)) {
ResMgr.GetInstance().LoadAsync<GameObject>("cube", (obj) => {
Debug.Log("调用了回调函数");
});
}
}

浙公网安备 33010602011771号