Unity框架学习--资源管理器

资源加载方案

1、Inspector窗口拖拽
        在脚本中用public声明变量,然后在Inspector窗口把要加载的资源拖拽给该脚本的变量。
        不建议在大型项目使用。在公司的项目也不要用。
        如果你是独立游戏开发者,则可以用。
        不支持热更新。

2、Resources
        用Resources.Load方法、Resources.LoadAsync方法、Resources.LoadAll方法来加载资源。
        可以在商业项目使用,包括公司的项目。但是Resources文件夹中可以存放的资源有限,大概只能存储2G左右的资源,因此要谨慎使用。
        不支持热更新。

3、AssetBundle
       用AssetBundle.LoadFromXXX方法来加载资源。
       商业项目常用的资源加载方案,如果你在公司做项目,则推荐用这种方式来加载资源。
       效率比Resources加载高,占用内存小,正式发布游戏后,资源所占用的空间也小。
       支持热更新。

4、Addressables(可寻址资源系统)
      可以理解为高级的AssetBundle,资源管理由Unity内部自动完成。
      但是目前还在发展中,可能有bug。主流的商业游戏都是使用AssetBundle来做资源加载的。
       支持热更新。

5、AssetDatabase
      用AssetDatabase.LoadAssetAtPath方法来加载资源。
      仅限于编辑器模式,主要用于在编辑器模式下用代码更改本地文件。
      游戏运行时不会用这种方案加载资源。
      不支持热更新。

Resources 动态加载资源

使用前必须在项目中创建一个名叫Resources的文件夹,这个名字是固定的。

        在一个项目可以创建多个名叫Resources的文件夹,它们可以放在Assets文件夹中的任意位置,使用Resources的方法加载时,将对每个Resources文件夹进行查找。
        注意:如果一个项目中有多个Resources文件夹,则应确保里面的文件的相对路径不重复,如果重复,则使用Resources.Load方法加载时,只会加载找到的第一个该名字的文件。

在同一个文件夹中,文件名不要重名,如果实在要重名,则加载时要使用泛型加载指定的类型

使用Resources.Load或者Resources.LoadAll加载时,路径是从Resources文件夹里面的文件夹开始的,例如Resources文件夹里有一个Audio文件夹,Audio文件夹里面也有一个Music文件夹,Music文件夹有一个叫做Song的.mp3文件,则路径是"Audio/Music/Song"

路径中的文件名末尾一定不要写后缀,写了后缀反而加载不成功。

路径可以用反斜杠来写。"Audio/Music/Song"可以写成:
        "Audio\\Music\\Song"
        或者
        @"Audio\Music\Song"
不建议路径用反斜杠来写,建议统一都用正斜杠来写。

Resources.Load(string 要加载的资源的路径)
返回值是Object型。
同步加载Resources文件夹中的资源。
如果有多个相同路径的资源,则只会返回找到的第一个资源。

Resources.Load(string 要加载的资源的路径, System.Type 要加载的资源的类型的Type对象)
返回值是Object型。
同步加载Resources文件夹中的指定类型的资源。
如果有多个相同类型,且相同路径的资源,则只会返回找到的第一个资源。

或者使用函数重载指定类型:

GameObject go = Resources.Load("Prefabs/Cube",typeof(GameObject)) as GameObject;

Resources.Load<要加载的资源的类型>(string 要加载的资源的路径)
返回值是要加载的资源的类型。
同步加载Resources文件夹中的指定类型的资源。
如果有多个相同类型,且相同路径的资源,则只会返回找到的第一个资源。

Resources.LoadAll(string 要加载的资源的文件夹路径或文件路径)
返回值是Object[]型。
同步加载Resources文件夹中指定路径的文件夹中的所有资源,包括其中子孙文件夹中的所有资源,然后返回到一个Object[]型数组。
如果该路径是一个文件,则只会加载该文件,并返回到一个Object[]型数组。
如果没有加载到任何资源,则返回一个没有任何元素的Object[]型数组。

Resources.LoadAll(string 要加载的资源的文件夹路径或文件路径,System.Type 要加载的资源的类型的Type对象)
返回值是Object[]型。
同步加载Resources文件夹中指定路径的文件夹中的指定类型的所有资源,包括其中子孙文件夹中的该类型的所有资源,然后返回到一个Object[]型数组。
如果该路径是一个该指定类型的文件,则只会加载该文件,并返回到一个Object[]型数组。
如果没有加载到任何资源,则返回一个没有任何元素的Object[]型数组。

Resources.LoadAll<T>(string 要加载的资源的文件夹路径或文件路径)
同步加载Resources文件夹中指定路径的文件夹中的指定类型的所有资源,包括其中子孙文件夹中的该类型的所有资源,然后返回到一个Object[]型数组。
如果该路径是一个该指定类型的文件,则只会加载该文件,并返回到一个Object[]型数组。
如果没有加载到任何资源,则返回一个没有任何元素的Object[]型数组。

Resources.LoadAsync(string 要加载的资源的路径,UnityAction<Object> 资源加载完毕后要执行的逻辑)
返回值是ResourceRequest类型。
一般配合协程来使用。在协程中可以使用yield return来等待资源加载。
异步加载Resources文件夹中的资源。
如果有多个相同路径的资源,则只会加载找到的第一个资源。
回调的参数就是加载的资源。

if (GUI.Button(new Rect(150,0,150,80),"异步加载单个资源")){StartCoroutine(LoadAsyncCoroutine());}IEnumerator LoadAsyncCoroutine(){//开始异步加载ResourceRequest resourceRequest = Resources.LoadAsync<GameObject>("Prefabs/Cube");//等待资源加载完毕yield return resourceRequest;//加载成功加载的资源--资源加载完毕后执行的逻辑Instantiate(resourceRequest.asset);}

Resources.LoadAsync(string 要加载的资源的路径,System.Type 要加载的资源的Type对象,UnityAction<Object> 资源加载完毕后要执行的逻辑)
返回值是ResourceRequest类型。
一般配合协程来使用。在协程中可以使用yield return来等待资源加载。
异步加载Resources文件夹中指定类型的资源。
如果有多个相同路径的资源,则只会加载找到的第一个资源。
回调的参数就是加载的资源。

Resources.LoadAsync<要加载的资源的类型>(string 要加载的资源的路径,UnityAction<要加载的资源的类型> 资源加载完毕后要执行的逻辑)
返回值是ResourceRequest类型。
一般配合协程来使用。在协程中可以使用yield return来等待资源加载。
异步加载Resources文件夹中指定类型的资源。
如果有多个相同类型,且相同路径的资源,则只会加载找到的第一个资源。
回调的参数就是加载的资源。

经用Resources.Load、Resources.LoadAsync、Resources.LoadAll加载的资源,即使在场景中没有使用,它们也会占用内存,此时要释放它们,就可以使用Resources.UnloadUnusedAssets方法和Resources.UnloadAssets方法。

Resources.UnloadUnusedAssets
返回值是AsyncOperation型。
异步卸载所有用Resources方式加载到内存中且当前没有被任何地方使用的资源。
可以配合协程使用。
例如要卸载某一个用Resources方式加载的预制体,则必须确保场景中所有这个预制体创建的物体都被销毁了,且这个预制体资源没有赋值给任何脚本中的任何变量。
如果有,可以把该变量也赋值为null,这样本方法才能成功释放它。

Resource.UnloadAsset(Object 要卸载的资源)
无返回值。
卸载指定的资源。
只能卸载非GameObject类型和Component类型,例如Mesh、Texture、Material、Shader。如果卸载了不让卸载的资源,则会报错。
如果随后加载的任何场景或资源引用了该资源,将导致从磁盘中加载该资源的新实例。此新实例将与先前卸载的对象相互独立。


Resources.FindObjectsOfTypeAll<要查找的类型>()
把已加载的指定类型的对象返回成指定类型的数组。
包括但不限于游戏对象、预制件、材质、网格、纹理等。
此方法还把Unity内部对象返回到该数组中,因此请小心处理返回的对象。
只要对象是指定的类型的,且已经加载了它,即使它是被禁用,也会被返回到该数组。

Resources.FindObjectsOfTypeAll(Type 要查找的类型的Type对象)
把已加载的指定类型的对象返回成Object[]型的数组。
包括但不限于游戏对象、预制件、材质、网格、纹理等。
此方法还把Unity内部对象返回到该数组中,因此请小心处理返回的对象。
只要对象是指定的类型的,且已经加载了它,即使它是被禁用,也会被返回到该数组。

Resources.InstanceIDToObject(int 对象的实例ID)
返回值是Object型。
根据对象的实例ID返回该对象。
对象的实例ID可以通过  对象.GetInstanceID()  获取。

同步 异步

同步:做一件事情,完成之后,再做下一件事情。事情必须做完一件再做另一件。

异步:做一件事情,开始做的时候,不等事情做完,就立即开始做下一件事情。多件事情可以一起做。

同步和异步最大的区别在于:同步会阻塞主线程,异步不会阻塞主线程。
 

封装ResourcesManager的异步加载

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;/// <summary>
/// 资源管理器
/// </summary>
public class ResourcesManager : SingletonPatternBase<ResourcesManager>
{/// <summary>/// 异步加载Resources文件夹中指定类型的资源/// </summary>public void LoadAsync<T>(string path,UnityAction<T> callback = null) where T:Object{MonoManager.Instance.StartCoroutine(LoadAsyncCoroutine<T>(path, callback));}IEnumerator LoadAsyncCoroutine<T>(string path, UnityAction<T> callback = null) where T : Object{//开始加载资源ResourceRequest resourceRequest = Resources.LoadAsync<T>(path);//等待资源加载完毕yield return resourceRequest;//执行资源加载完毕后的动作callback?.Invoke(resourceRequest.asset as T);}/// <summary>/// 异步卸载资源,往往在切换场景的时候使用/// </summary>/// <param name="callback"></param>public void UnloadUnusedAssets(UnityAction callback=null){MonoManager.Instance.StartCoroutine(UnloadUnusedAssetsCoroutine(callback));}IEnumerator UnloadUnusedAssetsCoroutine(UnityAction callback = null){//开始卸载资源AsyncOperation asyncOperation = Resources.UnloadUnusedAssets();//等待资源卸载while(asyncOperation.progress < 1){//等待一帧yield return null;}//资源卸载之后的逻辑callback?.Invoke();}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/47640.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux面试笔试题(5)

79、下列工具中可以直接连接mysql的工具有【c 】。 A.xhsell B.plsql C.navicat D.以上都不是 Navicat 是一套可创建多个连接的数据库开发工具&#xff0c; 让你从单一应用程序中同时连接 MySQL、Redis、MariaDB、MongoDB、 SQL Server、Oracle、PostgreSQL和 SQLite 。它与…

七夕给TA满分宠爱!浪漫攻略为约会加分

浪漫的七夕将至&#xff0c;无论是异地恋人还是约会情侣&#xff0c;怎么能缺少节日仪式感~精心策划的约会计划&#xff0c;让浪漫“超级加倍”。 美好的二人世界&#xff0c;共度甜蜜时光&#xff0c;当然需要提前做好攻略&#xff0c;风和日丽的好天气能为约会加分不少。在规…

ArcGIS Serve Windows下用户密码变更导致Server服务无法启动问题

问题&#xff1a; 因未知原因Windows下的Server安装账户密码变更&#xff0c;但是又忘记了密码&#xff0c;导致&#xff0c;Server服务启动失败&#xff0c;错误1069&#xff1a; 解决方法&#xff1a; 在账户管理界面&#xff0c;重置对应的arcgis账户的密码&#xff0c;…

初识Redis

简介RedisRedis安装怎么远程连接基础命令常用类型字符串类型字典类型列表类型集合类型有序集合类型 spring boot集成Redis代码操作Redis 实现一个session储存到redis持久化缓存雪崩缓存穿透缓存击穿缓存预热 项目升级之Redis储存Session 简介Redis Redis是一种内存数据存储系统…

open cv学习 (四)图像的几何变换

图像的几何变换 demo1 # dsize实现缩放 import cv2 img cv2.imread("./cat.jpg") dst1 cv2.resize(img, (100, 100)) dst2 cv2.resize(img, (400, 400)) # cv2.imshow("img", img) # cv2.imshow("dst1", dst1) # cv2.imshow("dst2&quo…

华人画家戴渭作品 3000 万拍出,牛津艺术学院发出任教邀请

爱丁堡,2023年7月 - 画家戴渭以他独特的画风、深邃的意境和慈悲智慧的属性,将艺术与宗教融合于作品之中。初看他的作品,可能会被其高超的艺术水准所震撼,然而仔细品味,方能领略到他深邃的艺术造诣与宗教智慧的深度融合。 作为国内最年轻的华人80后画家之一,戴渭近期被英国牛津…

数据库知识

怎么做 常见的数据库 Oracle Mysql SOLSever Navicat &#xff08;新版可以链接mysql oracle&#xff09; http://sqlfiddle.com/ 数据库操作在线练习 mysql自带四个数据库 数据库语言的使用 显示数据库&#xff1a;show databases&#xff1b; 创建数据库&#xff1a;…

linux笔试题

1&#xff0c;nginx中设定js,css,文件的过期时间为5分钟 location ~.*\.(js|css)?$ { expires 5m; } 2, 请解读以下Nginx配置文件的执行内容 http {map $http_x_forwarded_for $blocked_ip {~*^(31\.41\.244\.|141\.98\.11\.) 1;default 0;}upstream backend {ip_hash;…

【高级IO】- 多路转接之 poll | epoll

目录 I/O多路转接 - poll poll 函数 poll 服务器 poll 服务器 poll 的优点 poll 的缺点 I/O 多路转接 - epoll epoll 的相关系统调用 epoll_create 函数 epoll_ctl 函数 epoll_wait 函数 epoll 工作原理 epoll 服务器 ​编辑 epoll 的优点&#xff08;与 sele…

Go语言基础:Interface接口、Goroutines线程、Channels通道详细案例教程

目录标题 一、Interface1. Declaring and implementing an interface2. Practical use of an interface3. Nterface internal representation4. Empty interface5. Type assertion6. Type switch7. Implementing interfaces using pointer receivers VS value receivers8. Impl…

使用Ftp服务器+快解析软件,让你的文件随时随地可访问

你是否曾经遇到过这样的情况&#xff1f;你在办公室工作到很晚&#xff0c;突然想起家里的电脑里有重要文件&#xff0c;但却无法立即访问&#xff1f;或者你想要和朋友分享一些照片&#xff0c;却发现你的电脑和他们之间的距离太远&#xff0c;无法直接传输文件&#xff1f;如…

Win系统下安装Linux双系统教程

软件下载 软件&#xff1a;Linux版本&#xff1a;18.0.4语言&#xff1a;简体中文大小&#xff1a;1.82G安装环境&#xff1a;Win11/Win10/Win8/Win7硬件要求&#xff1a;CPU2.0GHz 内存4G(或更高&#xff09;下载通道①丨百度网盘&#xff1a;1.ubuntu18.0.4下载链接&#xf…

回归预测 | MATLAB实现SCN随机配置网络多输入单输出回归预测(多指标,多图)

回归预测 | MATLAB实现SCN随机配置网络多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09; 目录 回归预测 | MATLAB实现SCN随机配置网络多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09;效果一览基本介绍程序设计参考资料 效果一览 基本…

C语言,Linux,静态库编写方法,makefile与shell脚本的关系。

静态库编写&#xff1a; 编写.o文件gcc -c(小写) seqlist.c(需要和头文件、main.c文件在同一文件目录下) libs.a->去掉lib与.a剩下的为库的名称‘s’。 -ls是指库名为s。 -L库的路径。 makefile文件编写&#xff1a; CFLAGS-Wall -O2 -g -I ./inc/ LDFLAGS-L./lib/ -l…

c# 实现sql查询DataTable数据集 对接SqlSugar ORM

有时候对于已经查询到的数据集&#xff0c;想要进行二次筛选或者查询&#xff0c;还得再查一遍数据库 或者其他的一些逻辑处理不太方便&#xff0c;就想着为什么不能直接使用sql来查询DataTable呢&#xff1f; 搜索全网没找到可用方案&#xff0c;所以自己实现了一个。 主要…

HTTP连接管理

基础知识&#xff1a;非持久连接 HTTP初始时1.0版本在浏览器每一次向服务器请求完资源都会立即断开TCP连接&#xff0c;如果想要请求多个资源&#xff0c;就必须建立多个连接&#xff0c;这就导致了服务端和客户端维护连接的开销。 例如&#xff1a;一个网页中包含文字资源也包…

Stable Diffusion的使用以及各种资源

Stable Diffsuion资源目录 SD简述sd安装模型下载关键词&#xff0c;描述语句插件管理controlNet自己训练模型 SD简述 Stable Diffusion是2022年发布的深度学习文本到图像生成模型。它主要用于根据文本的描述产生详细图像&#xff0c;尽管它也可以应用于其他任务&#xff0c;如…

MySQL之索引和事务

索引什么是索引索引怎么用索引的原理 事务使用事务事务特性MySQL隔离级别 索引 什么是索引 索引包含数据表所有记录的引用指针&#xff1b;你可以对某一列或者多列创建索引和指定不同的类型&#xff08;唯一索引、主键索引、普通索引等不同类型&#xff1b;他们底层实现也是不…

Vue 2 组件注册

组件名的命名规则 定义组件名的两种方式&#xff1a; 短横线分隔命名&#xff0c;Kebab Case&#xff0c;例如my-component-name。单词首字母大写命名&#xff0c;Pascal Case&#xff0c;例如MyComponentName。 第一种方式在模板中使用<my-component-name>引用该元素…

FastDFS与Nginx结合搭建文件服务器,并实现公网访问【内网穿透】

文章目录 前言1. 本地搭建FastDFS文件系统1.1 环境安装1.2 安装libfastcommon1.3 安装FastDFS1.4 配置Tracker1.5 配置Storage1.6 测试上传下载1.7 与Nginx整合1.8 安装Nginx1.9 配置Nginx 2. 局域网测试访问FastDFS3. 安装cpolar内网穿透4. 配置公网访问地址5. 固定公网地址5.…