【Unity程序技巧】 资源加载管理器


👨‍💻个人主页 :@元宇宙-秩沅

👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅!

👨‍💻 本文由 秩沅 原创

👨‍💻 收录于专栏 :Unity基础实战

⭐🅰️⭐



文章目录


⭐前言⭐


🎶(W) 资源加载管理器


1.涉及知识点



2. 特点


  • 方便加载资源,为资源加载提供了接口

3.脚本


csharp 复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;


public class ResourceManager : SingleManager<ResourceManager>
{
    //同步加载资源方法
    public T Load<T>(string name) where T:Object
    {
        T resource = Resources.Load<T>(name);
     
        if (resource is GameObject)

            return GameObject.Instantiate(resource);
        else
            return resource;
    }


    //异步加载资源方法
    public void LoadAsync<T>(string name, UnityAction<T> callback) where T:Object
    {
        //开启异步加载的协程
        UpdateManager.GetInstance().StartCoroutine(ReallyLoadAsync(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);
    }
   //为什么这里要用Unity委托,因为实例化语句执行后我们要获得实例化的返回值。但在协同函数中,无法实现,所以需要一个有返回值的委托代替

}
  • 加载测试
csharp 复制代码
    void Start()
    {
        //同步加载
        ResourceManager.GetInstance().Load<GameObject>("asda");
        //异步加载
        ResourceManager.GetInstance().LoadAsync<GameObject>("asdsa",(aa)=>
        {
            print(aa.name); 
        });
    }

⭐🅰️⭐


⭐【Unityc#专题篇】之c#进阶篇】

⭐【Unityc#专题篇】之c#核心篇】

⭐【Unityc#专题篇】之c#基础篇】

⭐【Unity-c#专题篇】之c#入门篇】

⭐ 【Unityc#专题篇】---进阶章题单实践练习

⭐【Unityc#专题篇】---基础章题单实践练习

⭐ 【Unityc#专题篇】---核心章题单实践练习


你们的点赞👍 收藏⭐ 留言📝 关注✅是我持续创作,输出优质内容的最大动力!、



using System.Collections;

using System.Collections.Generic;

using UnityEngine;

using UnityEngine.Events;

public class ResourceManager : SingleManager

{

//同步加载资源方法

public T Load(string name) where T:Object

{

T resource = Resources.Load(name);

复制代码
    if (resource is GameObject)

        return GameObject.Instantiate(resource);
    else
        return resource;
}


//异步加载资源方法
public void LoadAsync<T>(string name, UnityAction<T> callback) where T:Object
{
    //开启异步加载的协程
    UpdateManager.GetInstance().StartCoroutine(ReallyLoadAsync(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);
}

//为什么这里要用Unity委托,因为实例化语句执行后我们要获得实例化的返回值。但在协同函数中,无法实现,所以需要一个有返回值的委托代替

}

复制代码
+ 加载测试

```csharp
    void Start()
    {
        //同步加载
        ResourceManager.GetInstance().Load<GameObject>("asda");
        //异步加载
        ResourceManager.GetInstance().LoadAsync<GameObject>("asdsa",(aa)=>
        {
            print(aa.name); 
        });
    }
相关推荐
郝学胜-神的一滴43 分钟前
C++ Templates 01:拨开迷雾,读懂C++模板经典著作
开发语言·c++·程序人生·游戏·游戏引擎·软件构建
淡海水2 小时前
02-01-原理篇-Mark-Sweep与变种算法
算法·unity·c#·游戏引擎·.net·gc
babywang03 小时前
Unity笔记--塔防游戏中的ECS架构:从原理到实战的全面解析
unity·ecs架构
babywang01 天前
Unity笔记--AssetBundle详解
unity·游戏引擎
魔士于安1 天前
经典Game
游戏·游戏引擎·贴图·技术美术·模型
淡海水1 天前
01-04-认知篇-Unity内存全景
unity·c#·游戏引擎·.net·gc
598866753@qq.com2 天前
Codex与Unity
unity·游戏引擎
淡海水2 天前
01-03-认知篇-C#内存模型深度解析
unity·c#·游戏引擎·.net·gc
警醒与鞭策2 天前
Direct3D 12 中的内存管理
3d·游戏引擎·direct3d
淡海水2 天前
16-02-C#常用数据结构源码-附录B-源码索引速查
unity·c#·游戏引擎·il2cpp