7.资源模块
7.1 知识点
资源模块的作用
提供资源加载的公共接口
资源管理器
定义BaseResourceManager类
创建了一个名为BaseResourceManager的类,它继承自BaseSingletonInCSharp类。这表明BaseResourceManager是一个单例类,用于管理资源。
同步加载资源方法 Load(string resourcePath)
- 这是一个泛型方法,允许加载任何类型的资源(派生自Object)。
- 接受一个资源路径(resourcePath)作为参数,表示要加载的资源的路径。
- 使用Resources.Load
(resourcePath)同步加载资源。 - 如果加载的资源是一个GameObject类型的对象,它会被实例化(克隆)并返回。否则,返回加载的资源。
异步加载资源方法 LoadAsync(string resourcePath, UnityAction callback)
- 这也是一个泛型方法,允许异步加载任何类型的资源。
- 接受一个资源路径和一个回调函数作为参数。
- 调用LoadAsyncCoroutine方法来启动协程进行异步加载。
异步加载资源协程 LoadAsyncCoroutine(string resourcePath, UnityAction callback)
- 这是一个协程方法,用于异步加载资源。
- 创建一个ResourceRequest对象,使用Resources.LoadAsync
(resourcePath)异步加载资源。 - 在协程中等待资源加载完成(yield return resourceRequest)。
- 根据加载的资源类型,如果是GameObject类型,实例化它,否则直接使用加载的资源。
- 执行传入的回调函数 callback,传递加载的资源作为参数。
进行测试
private GameObject nowCube;
void Start()
{
BaseResourceManager.Instance.Load<GameObject>("Test/Cube");
BaseResourceManager.Instance.LoadAsync<GameObject>("Test/Sphere",(gameObject) =>
{
Destroy(gameObject,3f);
});
BaseResourceManager.Instance.LoadAsync<GameObject>("Test/Cube",(gameObject) =>
{
nowCube = gameObject;
SetNowCubeScale();
});
}
private void SetNowCubeScale()
{
nowCube.transform.localScale = new Vector3(5, 5, 5);
}
测试结果
7.2 知识点代码
BaseResourceManager
using System.Collections;
using UnityEngine;
using UnityEngine.Events;
// 资源管理器基类
public class BaseResourceManager : BaseSingletonInCSharp<BaseResourceManager>
{
// 同步加载资源
public T Load<T>(string resourcePath) where T : Object
{
T resource = Resources.Load<T>(resourcePath);
// 如果对象是一个GameObject类型的,实例化后返回
if (resource is GameObject)
{
return GameObject.Instantiate(resource);
}
else
{
return resource;
}
}
// 异步加载资源
public void LoadAsync<T>(string resourcePath, UnityAction<T> callback) where T : Object
{
BaseMonoBehaviourManager.Instance.StartCoroutine(LoadAsyncCoroutine(resourcePath, callback));
}
// 协程函数,用于异步加载资源
private IEnumerator LoadAsyncCoroutine<T>(string resourcePath, UnityAction<T> callback) where T : Object
{
ResourceRequest resourceRequest = Resources.LoadAsync<T>(resourcePath);
yield return resourceRequest;
T resource;
if (resourceRequest.asset is GameObject)
{
resource = GameObject.Instantiate(resourceRequest.asset) as T;
}
else
{
resource = resourceRequest.asset as T;
}
// 执行回调函数
callback?.Invoke(resource);
}
}
Lesson07_资源模块
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Lesson07_资源模块 : MonoBehaviour
{
private GameObject nowCube;
void Start()
{
BaseResourceManager.Instance.Load<GameObject>("Test/Cube");
BaseResourceManager.Instance.LoadAsync<GameObject>("Test/Sphere",(gameObject) =>
{
Destroy(gameObject,3f);
});
BaseResourceManager.Instance.LoadAsync<GameObject>("Test/Cube",(gameObject) =>
{
nowCube = gameObject;
SetNowCubeScale();
});
}
private void SetNowCubeScale()
{
nowCube.transform.localScale = new Vector3(5, 5, 5);
}
}
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com