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("调用了回调函数");
});
}
}
posted @   专心Coding的程侠  阅读(232)  评论(0编辑  收藏  举报
编辑推荐:
· [杂谈]如何选择:Session 还是 JWT?
· 硬盘空间消失之谜:Linux 服务器存储排查与优化全过程
· JavaScript是按顺序执行的吗?聊聊JavaScript中的变量提升
· [杂谈]后台日志该怎么打印
· Pascal 架构 GPU 在 vllm下的模型推理优化
阅读排行:
· 2000 Star,是时候为我的开源项目更新下功能了
· 面试官:DNS解析都整不明白,敢说你懂网络?我:嘤嘤嘤!
· [WPF UI] 为 AvalonDock 制作一套 Fluent UI 主题
· 基于.NET WinForm开发的一款硬件及协议通讯工具
· 内网穿透之http代理服务器

阅读目录(Content)

此页目录为空

点击右上角即可分享
微信分享提示