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的程侠  阅读(248)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)

阅读目录(Content)

此页目录为空

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