7.资源模块

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

×

喜欢就点赞,疼爱就打赏