Unity——工程与资源

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


一、Unity项目的文件夹结构

1.工程文件夹

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

 528798e0dcd840ab8a287947e9d0c0b9.png

  • 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文件夹下的几个特殊文件夹

4095bd4a37ae481bbae5ab6ecc8a8256.png

 

文件夹是否被打包说明
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.rhkb.cn/news/121408.html

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

相关文章

NVIDIA CUDA Win10安装步骤

前言 windows10 版本安装 CUDA &#xff0c;首先需要下载两个安装包 CUDA toolkit&#xff08;toolkit就是指工具包&#xff09;cuDNN 1. 安装前准备 在安装CUDA之前&#xff0c;需要完成以下准备工作&#xff1a; 确认你的显卡已经正确安装&#xff0c;在设备管理器中可以看…

Windows安装Nginx及部署vue前端项目操作

先在nginx官网下载windows下安装的包&#xff0c;并解压&#xff0c;到ngnix目录下 双击nginx.exe,会有黑窗闪过。 用cmd命令窗口&#xff0c;cd 到nginx解压目录&#xff0c;./nginx启动。 在浏览器中访问http://localhost:80,出现以下界面说明启动成功(由于笔者电脑80端口被…

SPA和MPA

SPA与MPA是什么 **SPA&#xff08;Single Page Application&#xff0c;单页应用&#xff09;**在首次加载时会下载一个单独的HTML文件&#xff0c;然后通过JavaScript动态加载内容&#xff0c;无需每次页面刷新时重新加载整个页面。**MPA&#xff08;Multi-Page Application&…

如何在IPhone 14、14 Pro和14 Pro Max上添加屏幕锁定

当你第一次获得iPhone时&#xff0c;系统会提示你为它创建一个密码&#xff0c;这样只有你才能访问它。你应该使用一个必须输入的密码&#xff0c;以便在iPhone 14被唤醒或打开时解锁它。这将提供更高级别的保护。当你打开数据保护时&#xff0c;iPhone上的数据会被加密&#x…

接口自动化测试系列-接口测试

接口测试工具-postman 利用postman完成接口测试:官网。 接口一般包含&#xff1a; url:请求地址&#xff0c;如:https://www.baidu.com/ method:请求方式&#xff0c;get,post,update,delete等 headers:请求头 body/params:请求体&#xff0c;post一般存在body中。get请求放在…

【商业案例应用】B端产品设计流程——智能客服案例

文章目录 1、项目背景介绍2、需求调研阶段3、项目立项阶段4、需求整理阶段 1、项目背景介绍 2、需求调研阶段 3、项目立项阶段 4、需求整理阶段

用idea查看sqlite数据库idea sqlite

1、安装Database Navigator插件 2、导入数据库并查看 3、删除数据库连接 在此做个笔记

软件测试|Python自动化测试实现的思路

Python自动化测试常用于Web应用、移动应用、桌面应用等的测试 Python自动化实现思路通常分为以下几步&#xff1a; 1. 确定自动化测试的范围和目标&#xff1a; 首先需要明确需要进行自动化测试的范围和目标&#xff0c;包括测试场景、测试用例、测试数据等。 2. 选择自动化…

一文读懂|内核顺序锁

Linux 内核有非常多的锁机制&#xff0c;如&#xff1a;自旋锁、读写锁、信号量和 RCU 锁等。本文介绍一种和读写锁比较相似的锁机制&#xff1a;顺序锁&#xff08;seqlock&#xff09;。 顺序锁与读写锁一样&#xff0c;都是针对多读少写且快速处理的锁机制。而顺序锁和读写…

【【STM32-29正点原子版本串口发送传输实验】

STM32-29正点原子版本串口发送传输实验 通过串口接收或发送一个字符 例程目的 开发板上我们接入的是实现异步通信的UART接口 USB转串口原理图 我们一步步分析 PA9是串口1 的发送引脚 PA10是串口1 的接受引脚 。因为我们现在只是用到异步收发器功能&#xff0c;所以我们现…

Visual Studio软件_MSC_VER值(MSVC编译器版本)的获取方法

本文介绍查看Visual Studio软件_MSC_VER值的方法。 _MSC_VER是微软公司推出的C/C 编译器——MSVC编译器的一个内置宏&#xff0c;其值表示当前Visual Studio软件中MSVC编译器的具体版本。不同的Visual Studio软件版本对应着不同的MSVC编译器版本——无论是不同发布年份的版本&…

微信小程序 通过响应式数据控制元素class属性

我想大家照这个和我最初的目的一样 希望有和vue中v-bind:class一样方便的指令 但答案不太尽人意 这里 我们只能采用 三元运算符的形式 参考代码如下 <view class"item {{ userId item.userId ? isThisUser : }}"> </view>这里 我们判断 如果当前ite…

管理类联考——数学——汇总篇——知识点突破——数据分析——计数原理——排列组合——分堆分配

⛲️ 一、考点讲解 1.方法介绍 在排列组合中&#xff0c;经常遇到元素分堆或分组问题&#xff0c;尤其难点是出现等数量的分堆&#xff0c;很多考生容易犯错误。 2.方法应用 平均分成的组&#xff0c;不管他们的顺序如何&#xff0c;都是一种情况&#xff0c;所以分组后一定要…

美创科技获通信网络安全服务能力评定(应急响应一级)认证!

近日&#xff0c;中国通信企业协会公布通信网络安全服务能力评定2023年第一批获证企业名单。 美创科技获得应急响应一级资质&#xff0c;成为2023年第一批获证企业之一&#xff01; 通信网络安全服务能力评定是对通信网络安全服务单位从事通信网络安全服务综合能力的评定&#…

Promise常用方法笔记

mixin.methods.getList(xxx) 是axios的二次封装 是通过Promise进行基本封装 let a mixin.methods.getList(toosSet.gettype);let b mixin.methods.getList(toosSet.gettypes);let c mixin.methods.getList(toosSet.gettypess);Promise.all([a, b, c]).then((res) > {aler…

连接云-边-端,构建火山引擎边缘云网技术体系

近日&#xff0c;火山引擎边缘云网络产品研发负责人韩伟在LiveVideoStack Con 2023上海站围绕边缘云海量分布式节点和上百T的网络规模&#xff0c;结合边缘云快速发展期间遇到的各种问题和挑战&#xff0c;分享了火山引擎边缘云网的全球基础设施&#xff0c;融合开放的云网技术…

【记录】USSOCOM Urban3D 数据集读取与处理

Urban3D数据集内容简介 Urban3D数据集图像为正摄RGB影像&#xff0c;分辨率为50cm。 从SpaceNet上使用aws下载数据&#xff0c;文件夹结构为&#xff1a; |- 01-Provisional_Train|- GT|- GT中包含GTC&#xff0c;GTI&#xff0c;GTL.tif文件&#xff0c;GTL为ground truth b…

vue v-on 艾特@

vue v-on 内联代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</titl…

centos7下docker设置新的下载镜像源并调整存放docker下载镜像的仓库位置

目录 1.设置镜像源 2.调整存放下载镜像的仓库位置 1.设置镜像源 在 /etc/docker下创建一个daemon.json文件。在json中下入 "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn/"] 完成配置 加载配置 systemctl daemon-reload 重启docker sy…

HarmonyOS/OpenHarmony(Stage模型)应用开发单一手势(二)

三、拖动手势&#xff08;PanGesture&#xff09; .PanGestureOptions(value?:{ fingers?:number; direction?:PanDirection; distance?:number}) 拖动手势用于触发拖动手势事件&#xff0c;滑动达到最小滑动距离&#xff08;默认值为5vp&#xff09;时拖动手势识别成功&am…