UF_OLDL6——资源加载模块

资源加载模块

注意!该资源加载模块不包含AB包相关内容

在之前的学习里我们已经大量的使用了Resource公共类动态读取资源
将其封装出一个资源加载模块可以更好的使用它

知识点:异步加载,委托和lambda表达式,协同程序,泛型

使用方法:
资源同步加载,如果加载的是游戏对象就直接实例化并返回该游戏对象
资源异步加载,如果加载的是游戏对象就直接实例化并返回该游戏对象,需要传入有参数的回调函数,加载完毕后执行,参数为读取到的资源

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
using System.Collections;
using UnityEngine;
using UnityEngine.Events;

public class ResourcesManager : BaseManager<ResourcesManager>
{
/// <summary>
/// 同步加载资源,如果是游戏对象就直接实例化,并返回游戏对象
/// </summary>
/// <param name="name">资源路径</param>
/// <typeparam name="T">资源类型</typeparam>
/// 这里的约束是Object(不是object万物之父),Resources读取返回的一定属于这种类型
public T Load<T>(string name) where T : Object
{
T res = Resources.Load<T>(name);
if (res is GameObject)
return GameObject.Instantiate(res);
else
return res;
}

/// <summary>
/// 异步加载资源,如果是游戏对象就直接实例化,并返回游戏对象,需要传入有参数的回调函数,参数为读取到的资源
/// </summary>
/// <typeparam name="T">资源类型</typeparam>
/// <param name="name">资源路径</param>
/// <param name="callback">当资源异步加载完成后获取资源并处理的回调函数</param>
public void LoadAsync<T>(string name, UnityAction<T> callback) where T : Object
{
MonoManager.Instance().StartCoroutine(ReallyLoadAsyne<T>(name, callback));
}

/// <summary>
/// 异步加载资源的协程使用的迭代器函数
/// </summary>
/// <typeparam name="T">资源类型</typeparam>
/// <param name="name">资源路径</param>
/// <param name="func">当资源异步加载完成后获取资源并处理的回调函数</param>
/// <returns>协程执行暂停后等待多久再执行</returns>
private IEnumerator ReallyLoadAsyne<T>(string name, UnityAction<T> callback) where T : Object
{
ResourceRequest rr = Resources.LoadAsync<T>(name);
yield return rr;
if (rr.asset is GameObject)
callback(GameObject.Instantiate(rr.asset) as T);
else
callback(rr.asset as T);
}
}