Unity——工程与资源

本文将详细介绍Unity工程的文件夹结构,以及动态加载资源的技术要点


一、Unity项目的文件夹结构

1.工程文件夹

在新建工程时,Unity会创建所有必要的文件夹。第一级文件夹有Assets,Library,Logs,Packages,ProjectSettings。

 

  • Assets:最主要的文件夹,保存着所有游戏用到的资产
  • Library:用于存放引擎必须的程序集和缓存资源。Library不存在时会自动生成,不需要也不建议上传到版本仓库(如SVN或Git仓库)中去
  • Logs:用于存放使用时产生的日志
  • Packages:目前大部分Unity的官方功能扩展都通过扩展包提供,Packages文件夹虽与扩展包有关,但里面只保存配置文件
  • ProjectSettings:所有的工程设置,包括共工程对应的Unity版本都在ProjectSettings文件夹中。不能直接改动该文件夹中的内容,不然会造成版本兼容性问题
  • (Temp):如果该工程正在被编辑,则会多出一个Temp(临时)文件夹,一旦工程关闭,该文件夹会自动消失

2.资产文件夹

由于Asset和Resource的含义相近,而且它们在Unity中都有特定的含义,因此翻译时将Asset称为资产,Resource称为资源,以示区分。

在Unity中,Asset(资源)和Resource(资源包)是两个不同的概念。

Asset(资源)是指在Unity项目中使用的各种资源文件,比如模型、纹理、材质、音频等。这些资源可以通过Unity编辑器导入到项目中,然后在代码中进行引用和使用。Assets文件夹是存放这些资源文件的默认文件夹。

Resource(资源包)是一个特定的文件夹,用于存放可在运行时加载的资源。可以将资源文件放在Resource文件夹中,并使用Resources类提供的方法在运行时加载这些资源。Resource文件夹可以位于Assets文件夹中的任意位置。

区别在于,Asset是在编辑器中管理和引用的资源,而Resource是在运行时动态加载的资源。Asset可以提前导入并在代码中直接引用,而Resource需要在代码中进行加载操作。另外,Asset在项目构建时会被打包到最终的应用程序中,而Resource则不会被自动打包,需要在运行时按需加载。

需要注意的是,Unity官方推荐使用AssetBundle来管理和加载运行时资源,因为它提供了更灵活和高效的资源管理方式。而Resource文件夹的使用在某些情况下可能会导致资源加载效率较低或管理不便。

Assets文件夹下所有的文件都是资产的一部分,但某一些资产不会被“打包”到最终发布的程序中,而其他资产则会被“打包”

要理解Assets文件夹的结构,首先要了解Assets文件夹下的几个特殊文件夹

 

文件夹是否被打包说明
Editor存放Unity编辑器专用的脚本和资源,如开发期用的扩展工具
Plugins存放第三方程序库
Resources全部资源文件夹。该文件夹下所有资源都会被压缩并打包。只有此文件夹下的内容才可以用Resource.Load加载
Streaming Assets全部该文件下的所有资源会被打包到最终的发布版中,但会保持原样,不会被压缩和加密。不需要让Unity处理的文件(如一些数据配置文件)适合放在此文件夹

除了以上特殊文件夹,在其他非特殊文件夹中的资产,Unity会根据是否引用了该资源而决定是否打包。

所有非编辑器专用的脚本资产文件都会被打包。这是由于非组件脚本也可能会被引用,不能依据是否挂载到物体上来确定一个脚本是否被用到。

被打包的资产都可以看作是发布的程序的一部分,但它们都是只读的,不能在运行时改写。换句话说,以上文件夹都不能用于做热更新。

二、META文件

在游戏的开发阶段会存在大量原始的资源和素材,如何管理它们是引擎需要考虑的。市面上的游戏引擎对原始资源的管理由以下两种主流方案。

  1. 引擎统一打包和管理所有资产。添加新资源时,通过统一的导入流程打包到专门的文件中,原始文件不再使用。
  2. 虽然引擎管理所有资产,但依旧会使用原始资源文件。一些必要信息(如模型的导入设置)会写在另外的配置文件中。

无论哪种方案,都必须对所有资产统一管理,而不能使用未处理、无记录的原始资源。

Unity采用的方案明显是第二种,它会对Assets文件夹下的所有文件生成一个名称相同,扩展名为meta的文件,包括文件夹也会生成对应的META文件。META文件是一个文本文件,里面记录了很多必要的信息,包括资产唯一标识符GUID、引用关系和资源导入设置的信息等。

其中资产唯一标识符GUID非常重要,它在资源初次导入时生成,有了它就能准确定位资源文件,文件的改名、移动和内容修改都不会使GUID变化。

脚本的META文件内容通常比较简单,只有十几行,而某些资源(如3D模型动画)往往有上千行,里面记录了必要的设置信息。

理解了META文件的重要性,在实际中还要注意以下几点:

  1. META文件与原始资源文件要一起管理。例如,新增Assets文件或文件夹时,一定要联通生成的META文件一同提交到版本仓库
  2. 重命名和移动文件要在Unity内进行,这样可以保证相应的META文件自动完成相应操作
  3. 不能直接复制META文件,否则会导致GUID重复。复制资产时应尽量在Unity内用复制命令(Ctrl+D)进行,这样会自动生成GUID不同的META文件
  4. 用脚本操作资产时要注意META文件的同步,尽量使用Unity提供的API,而不要使用原始的文件进行读写操作。这一点主要针对编辑器脚本,因为编辑器脚本有时会修改源文件的内容

三、动态加载和释放资源

一般简单的方法时使用公开变量加拖曳的方法引用资源,实际上动态加载资源的方法适用范围更广,也方便在运行时切换不同的资源。

1、动态加载资源

位于Resources文件夹下的资源都可以动态加载。动态加载资源的方法主要有Resources.Load()和Resources.LoadAll()两种,前者用于加载单个文件,而后者可以加载一个文件夹内的所有资源,结果以数组形式返回。

值得一提的是,重复加载相同的文件不会导致文件被多次加载,引擎可以判断哪些资源已经被加载过了。

2、卸载资源

加载的资源会占用内存空间,不再使用资源的时候应当卸载,卸载方法有以下两个。

//卸载一个资源
public static void UnloadAsset(Objetc assetToUnload);
//自动卸载所有未使用的资源
public static AsyncOperation UnloadUnusedAssets();

UnloadAsset()用于强制卸载一个资源,不管它是不是正在被使用。如果卸载了正在使用的资源,则会直接影响当前场景的表现。

UnloadUnusedAssets()方法会用异步方法自动卸载未被使用的资源。但问题是,如果脚本中有一个变量正在引用着某个资源,或是场景中某个忘记销毁的物体饮用者某个资源,则该资源会印在使用中而不会被自动卸载。

可以看出,写在背后隐含的问题要比加载多得多,对编程方法提出了更高的要求

3、代码示例

以下用一段简单的代码演示加载和卸载资源的编程方法

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class TestResources : MonoBehaviour
{void Start(){//加载资源////与之资源用GameObject表示,路径不包含Resources和扩展名GameObejct go = Resources.Load<GameObject>("Prefab/Cube");//资源加载和实例化是不同的GameObject go2 = Instantiate(go);//加载其他类型的资源Texture2D image= Resources.Load<Texture2D>("Images/1");Debug.Log(image.name);//卸载资源////强制卸载TestResources.UnloadAsset(image);//销毁物体Destroy(go2);}}

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

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

相关文章

stable diffusion实践操作-提示词插件安装与使用

本文专门开一节写提示词相关的内容&#xff0c;在看之前&#xff0c;可以同步关注&#xff1a; stable diffusion实践操作 正文 1、提示词插件安装 1.1、 安装 1.2 加载【应用更改并重载前端】 1.3 界面展示 1.3.-4 使用 里面有个收藏列表&#xff0c;可以收藏以前的所有提示…

CSC2121A

半桥架构的栅极驱动电路CSC2121A CSC2121系列是一款高性价比的半桥架构的栅极驱动专用电路&#xff0c;用于大功率MOS管、IGBT管栅极驱动。IC内部集成了逻辑信号处理电路、死区时间控制电路、欠压保护电路、电平位移电路、脉冲滤波电路及输出驱动电路&#xff0c;专用于无刷电…

10 行代码能做什么?

10 行代码能做什么&#xff1f; 写一串 SQL Join&#xff0c;统计全渠道市场营销的 ROI 用 JS 画个饼图&#xff0c;展示最有效的广告投放策略 用 Python 写段算法&#xff0c;分析销量骤降的原因是什么 …… 数据出错了&#xff0c;写个对数脚本 -_-|| AI 时代&#xff0c;…

Zookeeper的使用

一、Zookeeper简介 分布式协调框架&#xff0c;小型的树形结构数据共享储存系统。 zookeeper的应用场景 集群管理 注册中心 配置中心 发布者将数据发布到ZooKeeper一系列节点上面&#xff0c;订阅者进行数据订阅&#xff0c;当数据有变化时&#xff0c;可及时得到数据的变…

指针(个人学习笔记黑马学习)

1、指针的定义和使用 #include <iostream> using namespace std;int main() {int a 10;int* p;p &a;cout << "a的地址为&#xff1a;" << &a << endl;cout << "a的地址为&#xff1a;" << p << endl;…

promethues监控postgres,emqx,redis

一、监控postgres 1、安装监控 docker pull wrouesnel/postgres_exporter2、执行 docker run -d -p 9187:9187 --name postgres_exporter --nethost -d -e DATA_SOURCE_NAME"postgresql://postgres:123456192.168.12.116:5432/rcc-manage?sslmodedisable" wroues…

centos 7的超详细安装教程

打开虚拟机&#xff0c;创建一个新电脑 我们选择经典&#xff0c;然后选择下一步 我们选择稍后安装&#xff0c;我们在后面进行改设备 因为centos系统是linux系统的一个版本&#xff0c;所有我们选择linux&#xff0c;版本选择centos 7 64位&#xff0c;然后就是点击下一步 这一…

四、MySQL(表操作)如何添加字段?修改表?删除字段?修改表名?删除表?格式化某张表?

1、添加字段 &#xff08;1&#xff09;基础语法&#xff1a; alter table 表名 add 字段名 类型名(长度) [comment注释] [约束]; &#xff08;2&#xff09;示例&#xff1a;添加nickname这个字段 2、修改表 修改表中某个字段的【数据类型】/【数据类型&字段名】 &…

Microsoft Edge 主页启动diy以及常用的扩展、收藏夹的网站

一、Microsoft Edge 主页启动diy 二、常用的扩展 1、去广告&#xff1a;uBlock Origin 2、翻译&#xff1a; 页面翻译&#xff1a;右键就有了&#xff0c;已经内置了划词翻译 3、超级复制 三、收藏夹的网站

Nacos 配置管理及相关使用

文章目录 Nacos 配置管理一、统一配置管理1、在Nacos 中添加配置文件2、从微服务拉取配置3、配置实现步骤&#xff08;1&#xff09;引入 nacos-config 依赖&#xff08;2&#xff09;添加 bootstrap.yml&#xff08;4&#xff09;在 nacos 中添加配置 二、配置热更新1、配置热…

嵌入式部署机器学习模型---TinyML

我们目前生活在一个被机器学习模型包围的世界。在一天中&#xff0c;您使用这些模型的次数比您意识到的要多。诸如浏览社交媒体、拍照、查看天气等日常任务都依赖于机器学习模型。您甚至可能会看到此博客&#xff0c;因为机器学习模型向您推荐了此博客。 我们都知道训练这些模型…

Linux工具

一、yum yum可以看作一个客户端&#xff08;应用商店&#xff09;、应用程序&#xff0c;它如何知道去哪里下载软件&#xff1f; yum也是一个指令/程序&#xff0c;可以找到它的安装路径。 在list中可以看到yum能安装的所有软件&#xff0c;通过管道找到想要的&#xff0c;yum …

时序预测 | MATLAB实现Attention-GRU时间序列预测(注意力机制融合门控循环单元,TPA-GRU)

时序预测 | MATLAB实现Attention-GRU时间序列预测----注意力机制融合门控循环单元&#xff0c;即TPA-GRU&#xff0c;时间注意力机制结合门控循环单元 目录 时序预测 | MATLAB实现Attention-GRU时间序列预测----注意力机制融合门控循环单元&#xff0c;即TPA-GRU&#xff0c;时…

nvm安装后,安装并切换版本,node报错

1、下载 下载地址 https://github.com/coreybutler/nvm-windows/releases 这个版本是 v1.1.11&#xff0c;不喜欢的话&#xff0c;自己选版本 下载setup.exe&#xff0c;安装 2、安装 安装时候 安装路径可以自选&#xff0c;但是涉及到指向的路径&#xff0c;最好让它自己选&…

深入探索C语言自定义类型:打造你的编程世界

一、什么是自定义类型 C语言提供了丰富的内置类型&#xff0c;常见的有int, char, float, double, 以及各种指针。 除此之外&#xff0c;我们还能自己创建一些类型&#xff0c;这些类型称为自定义类型&#xff0c;如数组&#xff0c;结构体&#xff0c;枚举类型和联合体类型。 …

【TCP】四次挥手(最强详解!!通俗易懂!!)

目录 想要了解三次握手的话可以参考我的另外一篇博客 首先来了解一下FIN和ACK FIN ACK 接着我们再来具体的了解TCP四次挥手过程 转换为最最通俗理解方法: 想要了解三次握手的话可以参考我的另外一篇博客 【TCP】三次握手&#xff08;最强详解&#xff01;&#xff01;通俗…

C++之std::distance应用实例(一百八十八)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

MySQL 8 数据清洗总结

MySQL 8 数据清洗三要素&#xff1a; 库表拷贝和数据备份数据清洗SQL数据清洗必杀技-存储过程 前提&#xff1a;数据库关联库表初始化和基础数据初始化&#xff1a; -- usc.t_project definitionCREATE TABLE t_project (id varchar(64) NOT NULL COMMENT 主键,tid varchar(…

以物联网为核心的智慧工地云平台:聚集智能技术,实现建筑工地智慧管理

智慧工地云平台源码&#xff0c;智慧工地项目监管平台源码&#xff0c;智慧工地可视化数据大屏源码 智慧工地云平台是将云计算、大数据、物联网、移动技术和智能设备等信息化技术手段&#xff0c;聚集在建筑工地施工管理现场&#xff0c;围绕人员、机械、物料、环境等关键要素&…

Docker Compose 安装使用 教程

Docker Compose 1.1 简介 Compose 项目是 Docker 官方的开源项目&#xff0c;负责实现对 Docker 容器集群的 快速编排 。从功能上看&#xff0c;跟 OpenStack 中的 Heat 十分类似。 其代码目前在 https://github.com/docker/compose 上开源。 Compose 定位是 「定义和运行多个…