[Unity3D——用代码说明一切] 基础模块:Resources同步异步加载管理器

 主要目的:将Resources资源同步和异步加载封装起来,方便外部使用。

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// 
/// Resources同步异步资源加载管理器
/// 
public class ResourcesMgr : BaseManager
{
    //资源容器
    //优点:避免重复加载,提升加载效率
    //缺点:内存占用,需要自己合理掌握释放时机
    private Dictionary resDic = new Dictionary();

    /// 
    /// 清空资源
    /// 
    public void Clear()
    {
        resDic.Clear();
    }

    /// 
    /// 加载资源
    /// 
    /// 资源名
    /// 资源加载完成后做的事
    /// 是否是异步加载
    public void LoadRes(string name, Action loadOverDo, bool isAsync = true)
    {
        //加载过的资源 不管异步与否 都直接传出去
        if (resDic.ContainsKey(name))
        {
            //如果是GameObject 实例化后再传出去
            if (resDic[name] is GameObject)
                loadOverDo(GameObject.Instantiate(resDic[name] as GameObject));
            //如果不是 直接传出去
            else
                loadOverDo(resDic[name]);
        }
        else
        {
            //是异步加载 协程异步加载
            if (isAsync)
                GlobalMonoMgr.Instance.StartCoroutine(LoadResAsync(name, loadOverDo));
            else
            {
                //添加新资源
                resDic.Add(name, Resources.Load(name));
                //如果是GameObject 实例化后再传出去
                if (resDic[name] is GameObject)
                    loadOverDo(GameObject.Instantiate(resDic[name] as GameObject));
                //如果不是 直接传出去
                else
                    loadOverDo(resDic[name]);
            }
        }
            
    }

    /// 
    /// 异步加载
    /// 
    /// 
    /// 
    /// 
    private IEnumerator LoadResAsync(string name, Action loadOverDo)
    {
        //异步加载
        ResourceRequest r = Resources.LoadAsync(name);
        yield return r;
        //没有记录过的资源,记录之
        if (!resDic.ContainsKey(name))
            resDic.Add(name, r.asset);
        //如果是GameObject 实例化后再传出去
        if(resDic[name] is GameObject)
            loadOverDo(GameObject.Instantiate(resDic[name] as GameObject));
        //如果不是 直接传出去
        else
            loadOverDo(resDic[name]);
    }
} 
  

 

你可能感兴趣的:(C#,Unity3D,游戏开发,Unity,Resources,C#,游戏开发)