Unity项目资源加载管理简易框架(Resource)

2023-11-19

一、背景

在Unity的轻量型项目中如果对优化没有特别搞得要求,如果需要用到Resource.Load这个接口来对资源进行加载,且当模型音效UI等资源繁杂需要对其进行管理时,便可能需要一个Resource文件夹下的资源加载管理器用于对资源进行统一管理。

二、思路概述

按照资源的类型在Resource中建文件夹,在管理器中对文件夹的路径进行统一保存,对已加载的资源用一个字典进行统一保存来对所加载资源的内存和路径等信息进行统一管理,另外实现一些对字典的特定操作方法即可实现对资源加载的管理。

三、具体实现代码及其思路梳理

1.资源路径

确定有哪些资源,对资源的类型进行分类,对此建立一个枚举类型方便后期加载资源时的区分。

public enum AssetsEnum
{
    //模型
    Model,
    //音效
    Audio,
    //界面
    UIPrefab,
    //icon
    Icon,
    //背景图
    TexBg,
}

对不同的资源类型在Resource文件夹下分别建立各自的文件夹,并将其路径进行静态存储

public static readonly string ModelRootPath = "Model/";
public static readonly string AudioRootPath = "Audio/";
public static readonly string UIRootPath = "Prefabs/UI/";
public static readonly string IconRootPath = "Texture/Icon/";
public static readonly string TexBgRootPath = "Texture/TexBg/";

为方便生成对应资源的路径信息,可以封装一个方法,当调用时只需要传入名字和资源类型即可

static string GetResPath(string assetName, AssetsEnum assetsEnum)
{
    string path = "";
    switch (assetsEnum)
    {
        case AssetsEnum.Model:
            path = ModelRootPath + assetName;
            break;
        case AssetsEnum.Audio:
            path = AudioRootPath + assetName;
            break;
        case AssetsEnum.UIPrefab:
            path = UIRootPath + assetName;
            break;
        case AssetsEnum.Icon:
            path = IconRootPath + assetName;
            break;
        case AssetsEnum.TexBg:
            path = TexBgRootPath + assetName;
            break;
    }
    return path;
}

2.资源管理

对于已经加载的资源,将他们的路径、名字和资源一起封装成一个类,将他们存入一个列表来进行管理。

public static List<AssetDataInfo> dicAllAsset = new List<AssetDataInfo>();
public class AssetDataInfo
{
    public string assetName;
    public AssetsEnum assetType;
    public Object assetObj;
}

3.资源加载

到此我们已经可以获取到资源的路径并已经有了一个列表可以来对加载资源数据信息进行存储和管理,下面来写资源的加载,这里记录的是同步加载资源的两种方式。

publicstatic T LoadResAsset<T>(string assetName, AssetsEnum assetsEnum) where T : Object
{
    AssetDataInfo fdata = dicAllAsset.Find(x => x.assetName == assetName);
    if (fdata != null)
    {
        return (T)fdata.assetObj;
    }
    string path = GetResPath(assetName, assetsEnum) ;
   
    T loadAsset = Resources.Load<T>(path);
    //无效资源判断,null 或值类型判断
    if (loadAsset == default(T))
    {
        Debug.LogWarning("加载的资源不存在assetName=" + assetName);
        return default(T);
    }
    AssetDataInfo dataInfo = new AssetDataInfo();
    dataInfo.assetName = assetName;
    dataInfo.assetType = assetsEnum;
    dataInfo.assetObj = loadAsset;
    dicAllAsset.Add(dataInfo);
    return loadAsset;
}
public static Object LoadResAsset(string assetName, AssetsEnum assetsEnum, System.Type systemTypeInstance = null)
{
    Object asset = null;
    AssetDataInfo fdata = dicAllAsset.Find(x => x.assetName == assetName);
    if (fdata != null)
    {
        return fdata.assetObj;
    }
    string path = GetResPath(assetName, assetsEnum);
    if (systemTypeInstance == null)
    {
        asset = Resources.Load(path);
    }
    else
    {
        asset = Resources.Load(path, systemTypeInstance);
    }

    if (asset != null)
    {
        AssetDataInfo dataInfo = new AssetDataInfo();
        dataInfo.assetName = assetName;
        dataInfo.assetType = assetsEnum;
        dataInfo.assetObj = asset;
        dicAllAsset.Add(dataInfo);
    }
    else
    {
        Debug.LogWarning("加载的资源为空assetName=" + assetName);
    }
    return asset;
}

4.资源管理

在已经得到了一个资源列表的情况下,提前写一些对列表操作的方法,如资源的清理卸载或查找等,便可在其他的代码中对资源进行管理

//获取所有的图片
public static Sprite[] GetAllSprite(string assetName, AssetsEnum assetsEnum)
{
    string path = GetResPath(assetName, assetsEnum);
    Sprite[] allSp = Resources.LoadAll<Sprite>(path);
    return allSp;
}
//获取资源路径
static string GetResPath(string assetName, AssetsEnum assetsEnum)
{
    string path = "";
    switch (assetsEnum)
    {
        case AssetsEnum.Model:
            path = ModelRootPath + assetName;
            break;
        case AssetsEnum.Audio:
            path = AudioRootPath + assetName;
            break;
        case AssetsEnum.UIPrefab:
            path = UIRootPath + assetName;
            break;
        case AssetsEnum.Icon:
            path = IconRootPath + assetName;
            break;
        case AssetsEnum.TexBg:
            path = TexBgRootPath + assetName;
            break;
    }
    return path;
}
//销毁对象
public static void DestroyObj(GameObject obj, bool bImmediate = false)
{
    if (null != obj)
    {
        if (false == bImmediate)
        {
            GameObject.Destroy(obj);
        }
        else
        {
            GameObject.DestroyImmediate(obj);
        }
    }
}
//清理某资源
public static void ClearAsset(string assetName)
{
    AssetDataInfo fdata = dicAllAsset.Find(x => x.assetName == assetName);
    if (fdata != null)
    {
        dicAllAsset.Remove(fdata);
    }
}
//清理并卸载对应类型的资源
public static void ClearAsset(AssetsEnum etype)
{
    for (int i = dicAllAsset.Count-1; i >0; i--)
    {
        if (dicAllAsset[i].assetType==etype)
        {
            dicAllAsset.RemoveAt(i);
        }
    }
    Resources.UnloadUnusedAssets();
}
//清理并卸载所有资源
public static void ClearAllAsset()
{
    dicAllAsset.Clear();
    Resources.UnloadUnusedAssets();
}
//获取已加载的资源数量
public static int GetAssetCount()
{
    return dicAllAsset.Count;
}

四、说明

  1. 该模板只是一个初步整理的简易框架,可能会有描述不清晰,框架结构不完善考虑不周到等问题。
  2. Resource文件夹上限为两个G左右,适合小项目或Demo使用,通常并不作为资源加载的选择。后续将整理通过AB包加载资源的方法及相应管理框架。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Unity项目资源加载管理简易框架(Resource) 的相关文章

随机推荐

  • 如何编译SQLite-How To Compile SQLite

    SQLite是ANSI C的源代码 在使用之前必须要编译成机器码 这篇文章是用于各种编译SQLite方法的指南 这篇文章不包含编译SQLite的每个步骤的反馈 那样可能会困难因为每种开发场景都不同 所以这篇文章描述和阐述了编译Sqlite的
  • 区块链应用开发(智能合约的开发和WeBASE合约IDE的使用)

    文章目录 四 智能合约的开发和WeBASE合约IDE的使用 一 实验概述 二 实验目标 三 实验环境及建议 四 实验步骤 4 1 启动Webase 4 2 智能合约开发 4 2 1 合约功能设计 4 2 2 存证合约开发 4 2 3 工厂合
  • 浅析赋值、浅拷贝、深拷贝的区别

    1 原理 赋值 将某一对象赋给某个变量的过程 称为赋值 浅拷贝 浅拷贝是创建一个对象 这个对象有着原始对象属性值的一份精准拷贝 如果属性是基本类型 拷贝的就是基本类型的值 如果属性是引用类型 拷贝的就是内存地址 如果其中一个对象改变了这个地
  • 寒假训练 第二节 数据结构基础 总结

    数组 定义 语言支持数组数据结构 它可以存储一个固定大小的相同类型元素的顺序集合 数组是用来存储一系列数据 但它往往被认为是一系列相同类型的变量 所有的数组都是由连续的内存位置组成 最低的地址对应第一个元素 最高的地址对应最后一个元素 数组
  • python 爬虫 GET(带参) 请求 配置params参数

    import requests 发送网络请求 response requests get http httpbin org get name Jack age 30 print response text 输出结果 args age 30
  • 2019北邮网安院机试真题(回忆版)@lantin

    2019北邮网安院机试真题 回忆版 细不谈 前两题真的都是签到题 会简单排序和if else都可以写的出来的题目 网安院的机试基本上是两道签到题 C题是数据结构题 D题是算法 做到保2争3 保3争4面试不出原则问题基本上复试稳了 Probl
  • Qt系列文章之 mousePressEvent

    上一篇文章介绍QTabWidget的使用技巧 本文开始介绍Qt最常用的事件之一QMouseEvent 鼠标事件 mousePressEvent 鼠标事件是Qt中十分重要的人机交互形式 鼠标事件包括很多内容 此处先介绍最基本的mousePre
  • MySQL 表分区 A PRIMARY KEY must include all columns in the table's partitioning function

    当我们在对MySQL的数据表进行分区的时候 很容易碰到如下错误 A PRIMARY KEY must include all columns in the table s partitioning function 意思是说分区的字段必须是
  • Qt 不规则窗口,不规则按钮,不规划控件 不规则界面

    有一些特殊情况 需要使用不规则窗口或按钮 看起来非常炫酷 类似 Qt 实现 不规则样式设置 不是视觉欺骗 是真正的不规则 点击外面不会触发按钮的点击信号 Part1 不规则窗口 效果 显示成一张图片中的图形 使用带有透明区域的png图片 i
  • 设计模式--提供者模式provider

    设计模式 C 提供者模式 Provider Pattern 介绍 为一个API进行定义和实现的分离 示例 有一个Message实体类 对它的操作有Insert 和Get 方法 持久化数据在SqlServer数据库中或Xml文件里 根据配置文
  • sql 求日期均值

    备忘一下 在sql中求日期均值的语句 首先 AVG 只能作用与数值型字段 不能作用于日期字段 所以不能像求数值均值一样求日期均值 要求日期均值 需要先把 日期转为Long 然后对转后的Long求均值 对Long求完均值 在把Long转为 日
  • git 将本仓库的分支代码提交到另外一个仓库

    因为新项目开发的项目代码是建立在另外一个项目的代码框架上进行样式与逻辑功能修改 所以为了省事 想着把旧仓库的temp分支代码直接提交到新仓库master分支底下进行项目开发 所以需要在git上进行一些操作 将本仓库的分支代码提交到另外一个仓
  • 【Linux扩容】Vmware虚拟机内的Linux扩容

    1 虚拟机设置 Vmware 虚拟机 设置 硬盘 扩展 40 64G 2 Linux磁盘扩展 有图形化桌面 GParted 分区上右键 扩展 保存 无图形化桌面 找一个有图形化桌面的Linux live镜像 CD载入 或者LinuxToGo
  • Linux网络编程之Tcp(内含服务器、客户端代码实例)

    文章目录 前言 Tcp模型 服务器端 客户机端 代码 运行结果 结束 前言 本节讲解需要相关的网络基础知识 如果缺少相关知识 请先学习 Linux网络编程之网络基础 和 Linux网络编程之网络基础2 Tcp模型 先打开我们之前讲过的Tcp
  • CVE-2021-40444漏洞复现详细

    2021年9月8日 微软官方发布了MSHTML组件的风险通告 漏洞编号 CVE 2021 40444 未经身份验证的攻击者可以利用该漏洞在目标系统上远程执行代码 微软官方表示已经监测到该漏洞存在在野利用 1 漏洞详情 Microsoft M
  • js 本地存储和获取

    localStorage setItem temp orderAr 存入 参数 1 调用的值 2 所要存入的数据 console log localStorage getItem temp 输出
  • 安装用jieba,实现用TF-IDF算法进行关键词的提取

    文本知识提取 目录 1 安装jieba 2 TF IDF算法 2 1算法的定义 2 2算法的应用 1 词性标注 2 去停用词 3 关键词提取 1 安装jieba Jieba分词官网 https github com fxsjy jieba
  • 基于k8s的微服务一键部署解决方案

    父项目msagd配置 编写pom xml的属性标签
  • Day8_8 Java学习之List集合类

    目录 一 List集合的概述 ArrayList集合类的概述 ArrayList集合的语法定义 ArrayList集合的常用方法 LinkedList集合概述 LinkedList集合的语法定义 LinkedList集合类常用方法 二 Se
  • Unity项目资源加载管理简易框架(Resource)

    文章目录 一 背景 二 思路概述 三 具体实现代码及其思路梳理 1 资源路径 2 资源管理 3 资源加载 4 资源管理 四 说明 一 背景 在Unity的轻量型项目中如果对优化没有特别搞得要求 如果需要用到Resource Load这个接口