Unity——工程与资源

news2025/1/12 7:51:03

本文将详细介绍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.coloradmin.cn/o/945342.html

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

相关文章

Win10永恒之黑CVE-2020-0796复现shell

鸣谢文章&#xff1a; CVE-2020-0796&#xff08;永恒之黑&#xff09;漏洞利用getshell复现详细过程 影响版本&#xff1a; Windows 10 Version 1903 for 32-bit Systems Windows 10 Version 1903 for x64-based Systems Windows 10 Version 1903 for ARM64-based Systems …

实训笔记8.29

实训笔记8.29 8.29笔记一、《白龙马电商用户行为日志分析平台》项目概述--大数据离线项目1.1 项目的预备知识1.1.1 电商平台1.1.2 用户行为数据1.1.3 常见的软件/网站的组成和技术实现1.1.4 大数据中数据计算场景 1.2 项目的开发背景和开发意义1.3 项目的开发流程和技术选项1.4…

【真题解析】系统集成项目管理工程师 2022 年下半年真题卷(综合知识)

本文为系统集成项目管理工程师考试(软考) 2022 年下半年真题&#xff08;全国卷&#xff09;&#xff0c;包含答案与详细解析。考试共分为两科&#xff0c;成绩均 ≥45 即可通过考试&#xff1a; 综合知识&#xff08;选择题 75 道&#xff0c;75分&#xff09;案例分析&#x…

聊聊十大网络安全上市公司,看F5拥有强大安全基因

在应用数量爆炸式增长的当下&#xff0c;包括供应链攻击、零日漏洞及数据泄露在内的安全威胁随处可见。从传统应用到现代应用再到边缘、多云、多中心的安全防护&#xff0c;安全已成为企业数字化转型中的首要挑战。谈到十大网络安全上市公司&#xff0c;拥有强大安全基因的F5是…

如何利用 Agent 构建AI服务

近年来&#xff0c;人工智能&#xff08;AI&#xff09;技术的飞速发展引起了广泛的关注和讨论。而如今&#xff0c;我们正站在一个全新的时代门槛前&#xff0c;面对着AI Agent带来的的崭新未来。以LLM&#xff08;大型语言模型&#xff09;作为其核心控制器构建代理是一个很酷…

ubuntu系统安装qemu虚拟机

安装命令 sudo apt install qemu qemu-kvm virt-manager bridge-utils -y 安装过程 安装完成之后需要重新启动操作系统 软件使用 拷贝系统镜像进行安装即可&#xff0c;跟vmware 和virbox也都类似

Springboot启动之后自动跳转浏览器

2023-08-29 20:47:32.680 INFO 23700 --- [ main] com.liu.ReggieApplication : 项目启动成功。。。当项目启动成功后&#xff0c;不会自动弹出浏览器到默认页面 学要写个配置类 首先创建一个资源配置 url.properties openProject.isOpentrue openP…

办公网络上网行为管理规划

办公网络上网行为管理规划是确保办公网络资源的合理利用和保障网络安全的重要措施。下面是办公网络上网行为管理规划的一般性步骤和原则&#xff1a; 确立政策和准则&#xff1a; 制定明确的上网行为管理政策和准则&#xff0c;明确员工在办公网络上的合规要求和行为规范。 包…

ADS 错误 1808可能原因 ADSError 1808

​ 调试问题记录&#xff1a; 背景&#xff1a; Ads调试时遇到错误&#xff0c;返回码是 1808&#xff0c;查询倍福官网 得出1808错误原因是 symbol not found 原因&#xff1a; ADSError: symbol not found (1808). Possible incorrect runtime port selected 可能是ads的地…

【STM32】学习笔记-江科大

【STM32】学习笔记-江科大 1、STM32F103C8T6的GPIO口输出 2、GPIO口输出 GPIO&#xff08;General Purpose Input Output&#xff09;通用输入输出口可配置为8种输入输出模式引脚电平&#xff1a;0V~3.3V&#xff0c;部分引脚可容忍5V输出模式下可控制端口输出高低电平&#…

BI系统框架模型与指标库参考

主数据 &#xff1a;组织|岗位|人员|大区|三大主数据&#xff08;客户、物料、供应商&#xff09;财务主数据&#xff08;科目|成本中心|利润中心|资产&#xff09;|工作中心|工艺路线 业务数据 &#xff1a;线索|业务机会|合同|订单|采购|生产|发货|物流|财务&#xff0…

如何从任何打印机扫描到你的计算机

即使在这个几乎所有东西都是在线和虚拟的时代&#xff0c;你仍然会得到一些实物文档。保存这些文档的最佳方法是扫描它们并将其保存在硬盘、云存储或NAS上。 为此&#xff0c;你需要一台多功能或一体式打印机。然而&#xff0c;这些设备的设置和使用可能会令人困惑。它们通常需…

ARM处理器核心概述

一、基于ARM处理器的嵌入式系统 ARM核深度嵌入SOC中&#xff0c;通过JTAG口进行外部调试。计通常既有外部内存又有内部内存&#xff0c;从而支持不通的内存宽度、速度和大小。一般会包含一个中断控制器。可能包含一些Primece外设&#xff0c;需要从ARM公司取得授权。总线使用A…

工厂人员作业现场异常违规行为识别

工厂人员作业现场异常违规行为识别运用yolov7网络模型框架的图像识别技术&#xff0c;工厂人员作业现场异常违规行为识别工厂人员的行为是否合规SOP流程操作规范&#xff0c;帮助作业人员及时发现并纠正违规行为&#xff0c;确保作业过程的安全和合规性。Yolo意思是You Only Lo…

【已解决】Java 后端使用数组流 Array.stream() 将数组格式的 Cookie 转换成字符串格式

&#x1f389;工作中遇到这样一个场景&#xff1a;远程调用某个接口&#xff0c;该接口需要用户的 Cookie 信息进行权限认证&#xff0c;认证通过之后才可以打通并返回数据。 在后端拿到 httpServletRequest 后&#xff0c;调用 getCookies() 方法&#xff0c;返回的是一个 Coo…

10.物联网LWIP之TCP状态转变

一。TCP状态机 1.青粗线&#xff1a;理想TCP状态转变&#xff08;服务器视角下&#xff09; 2.虚线&#xff1a;被动TCP状态转变&#xff08;服务器视角下&#xff09; 3.细实线&#xff1a;不经常出现的TCP状态转变&#xff08;类似于边界处理&#xff09; 1.青粗线解释--》服…

基于 OV2640 的图像采集显示系统(camera_init 摄像头初始化模块)

此部分可参考IIC系列文章: (1)I2C 接口控制器理论讲解 (2)I2C接口控制设计与实现 (3)I2C连续读写实现 文章目录 前言一、OV2640 摄像头初始化模块设计思路二、OV2640 摄像头初始化模块用法介绍三、复位时序设计四、数据写入操作五、数据查找表六、完整代码展示六、仿真代码展示…

VIT 和Swin Transformer

VIT&#xff1a;https://blog.csdn.net/qq_37541097/article/details/118242600 Swin Transform&#xff1a;https://blog.csdn.net/qq_37541097/article/details/121119988 一、VIT 模型由三个模块组成&#xff1a; Linear Projection of Flattened Patches(Embedding层) Tran…

中文情感分类

本文通过ChnSentiCorp数据集介绍了文本分类任务过程&#xff0c;主要使用预训练语言模型bert-base-chinese直接在测试集上进行测试&#xff0c;也简要介绍了模型训练流程&#xff0c;不过最后没有保存训练好的模型。 一.任务和数据集介绍 1.任务 中文情感分类本质还是一个文本…

会员管理系统实战开发教程05-会员开卡

上一篇我们讲解了如何点击按钮弹出层&#xff0c;已经罗列了会员管理的一些常见功能。本篇我们介绍一下会员开卡的业务。 1 创建变量 我们会员开卡的业务的话&#xff0c;也是要在本页面弹出&#xff0c;弹出其实只是让组件是否显示和隐藏&#xff0c;我们先定义一个布尔值类…