本文将介绍Unity中的资产,Unity中的特殊文件夹,Unity的一些路径对应各个平台上的具体路径。

第一部分就是介绍资产Assets——哪些是Assets,Assets类型具体有哪些,如何在编辑器中搜索特定的Assets,与Assets息息相关的meta文件,对于从外界导入的Assets怎么进行流程化处理,如何设置对于一些二进制的资产进行序列化。

第二部分是Unity工程目录下的一些有特定用处特殊命名的文件夹。

第三部分介绍 Application.dataPath,Application.streamingAssetsPath,Application.persistentDataPath,Application.temporaryCachePath这四个接口在IOS,Android和Windows下具体的路径在哪里。

第四部分是Unity自带的工具。

目录

一:资产类型

1.资产(Asset)和资源(Resource)的区别:

2.资产类型(通过扩展名识别):

3.搜索资产和加载资产

4.资产meta文件

5.资产导入

6.资产序列化

二:特殊文件夹

1.Assets文件夹下的特殊文件夹

2.Library文件夹

1)ScriptAssemblies文件夹

2)metadata文件夹

3)AtlasCache 和 ShaderCache

3.ProjectSettings文件夹

4.Temp

三:重要路径

iOS

1.四个路径对应的平台下的路径

2.app的独立数据存储目录

3.各路径对应的OC访问方法

Android

1.四个路径对应的平台下的路径

2.重要目录

Windows:

四:Unity工具

1.查看unity里的二进制文件

参考:



一:资产类型

1.资产(Asset)和资源(Resource)的区别:

资产:Assets目录下的所有文件和文件夹

资源:Resources特殊目录下的文件

2.资产类型(通过扩展名识别):

•场景(.unity)

•预置体(.prefab)

•模型(.fbx)

•贴图(.jpeg/.png/.tga/…)

•脚本(.cs/.js)

文本(.txt/.bytes/.json/…)

•声音等…

特别的,对于Lua脚本

因为扩展名是.lua不能被Unity识别为TextAsset

所以打包lua时候:先改扩展名 .bytes--》再打包AssetBundle--》最后再改回来

3.搜索资产和加载资产

1.Project 视图: 搜索框输入比如  t:Prefab   t:Mesh   t:Scene   t:Model   t:ScriptableObject (等价于点击搜索框右边的 SearchByType)

2.代码中使用搜索:接口 AssetDatabase.FindAssets

string[] guids = AssetDatabase.FindAssets("t:Mesh", searchFolder);

3.代码中加载资产,使用对应的类:接口 AssetDatabase.LoadAssetAtPath

 AudioClip audioClip = AssetDatabase.LoadAssetAtPath("XXXX路径下音频名.wav",typeof(AudioClip)) as AudioClip;

4.资产meta文件

Asset中的所有文件、文件夹,经过unity的导入过程后,会为每个都生成一个.meta文件,这个文件是unity内部管理文件的重要内容,包含:

1)GUID(标识资产的唯一编号)。 优点之一是对象之间的引用不是通过资产路径来引用,而是通过GUID来引用。所以改变资产路径不会使得引用失效。所以一旦Meta中的GUID变更了,就要注意,它很可能引起一场引用丢失的灾难。编辑器中使用AssetDatabase.GUIDToAssetPathAssetDatabase.AssetPathToGUID中可以进行互转。

       GUID保持不变的情况:移动、重命名、改动资源文件,都对GUID没有影响,GUID还是指向这个资源文件。

       GUID改变的情况:注意不要随意删除资源文件相关的meta文件。如果删除了meta文件,unity会认为原始的资源文件被删除了,并给此资源重新生成一个新的GUID。(为什么有时候场景中资源的引用会突然断开)

2)导入设置(default import setting):可以在meta文件中找一下在导入设置中的对应项目。

根据不同的文件类型,它的数据是不同的ImportSetting数据,比如上面的NativeFormatImporter、ModelImporter、AudioImporter等等。只要对照Inspector面板中的条目,都可以看懂每一行的意义。所以假如我们把一个文件和这个文件的Meta文件从一个Unity工程复制到另一个Unity工程中,它的配置是不会变的

比如在出现了dll出现在多个地方的错误: Plugin xxx is used from several locations ,就需要看下其Inspector设置中平台选择,修改过以后再看meta文件就有了相应的修改,就不会出错了

https://blog.csdn.net/huihut/article/details/86114865

关于meta文件

1. 新增资产文件或文件夹,一定要连同生成的meta文件一同提交。

2. 重命名和移动要在Unity内进行,这样可以保证相应的meta文件自动完成相应操作。

3. 复制资产时尽量在Unity内用Ctrl+D进行,这样会生成GUID不同的meta文件。

4. 用脚本操作资产时要注意meta文件的同步,尽量用AssetDatabase类的API而非文件I/O。

5. AssetDatabase.Refresh() 何时使用:当你使用System.IO 的东西去增删文件的时候,需要调用这个函数把修改的东西导入一遍,防止 Unity 继续使用缓存内容。如果使用 AssetDatabase 的方法来增删文件,是不需要调用这个函数。

5.资产导入

导入单个资产可能要花费好几秒。以贴图为例,需要做的一些事情:

生成必要的压缩图片以用于目标平台

生成预览用的小图

生成GUID

……

使用 脚本 将导入流程自动化  AssetPostprocessor 类。

待看:

https://blogs.unity3d.com/cn/2012/10/26/in-depth-cache-server/

https://blogs.unity3d.com/cn/2012/10/26/in-depth-cache-server/

6.资产序列化


二:特殊文件夹

1.Assets文件夹下的特殊文件夹

Editor

1.不会被打包。

2.放一些编辑器脚本,插件的安装包,以及不需要打进包的工具的资源。

Plugins

1.会被打包。可以不放在根目录下。

2.用来放插件,jar包,第三方SDK等。

Resources

1.资源会被压缩,转化成二进制。会被加密。

2.使用Resources.Load加载

3.不应放太多资源,以及配置文件等资源。Resources 目录大小和启动速度的关系https://blog.uwa4d.com/archives/QA_Loading_1.html

1.该文件夹下的资源无论使用与否都会被打包。

2.打包后文件夹下的资源只读。

3.无法做热更新。

Streaming Assets

1.打包时候资源不压缩不加密。所以此文件夹一定要注意大小,打包前多大,就会多大打到包中。

2.加载路径:Android平台上的特殊性——不能直接用文件I/O,即不能用Application.streamingAssetsPath

应该用:"jar:file://"+Application.dataPath+"!/assets"

3.在这个文件夹下主要存放一些二进制文件。

2.Library文件夹

此放的是程序集和库的缓存文件。

1)ScriptAssemblies文件夹 Project/Library/ScriptAssemblies

存放的是当前工程的程序集,脚本编译以后的DLL文件:

程序集分成运行时程序集编辑器程序集(带有Editor的)(各自都要依赖于对应的firstpass,所以才取名叫first吧,firstpass是在Plugins下面的)

所以其脚本也分成运行时脚本和编辑时脚本(肯定是在Editor文件夹下的那些了)。

下图是4个DLL的依赖关系,也决定了这4个DLL的编译顺序。

编辑器程序集构建的是哪些脚本呢?:是在 Editor 目录里的代码构成的。(Plugins下面的Editor就是Editor-firstpass.dll)

运行时程序集:打包的时候只会构建运行时的程序集。

每次修改脚本都会重新编译,那么我们可以针对这个进行优化。

Unity2018以后有程序集定义——project窗口,点Create

把每个独立的功能都划分到一个程序集中去。

外部代码可以访问这个程序集,但是如果访问生成的其他程序集,需要设置一下依赖关系。

ps:UnityEngine.dll 和 UnityEditor.dll

Unity自己提供的两个核心的库。

UnityEditor.dll 肯定是编辑器模式下用的,而编辑器只支持在Windows,macOS,Linux这三个平台。在这三个平台上,可以通过Mono实现跨平台。所以,编辑器的大部分都是由C#编写并且编译到UnityEditor.dll中。

UnityEngine.dll需要在运行时使用,而运行时的平台可不只上面三个,比如手机端ios和androi。所以 UnityEngine.dll 只是封装了C#接口,具体的更底层的实现是让这个dll再调用C++来完成的,Android端编译成的so库,ios端编译成的.a库。

可以反编译UnityEngine.dll 和 UnityEditor.dll

2)metadata文件夹

存放的是 unity导入的原始资源(存放Assets文件夹下)生成了unity内部特定的格式(unity可识别)文件在游戏中使用的文件。

每次修改了原始资源文件,就需要重新导入,生成unity可识别的文件格式。即每次删除此文件夹,再次打开unity,也就是重新导入一次,重新生成这个文件夹的那些文件。

文件夹都是两个字符,取自文件的GUID的前两个字符,文件名即是GUID。(meta文件)

如果把Assets文件夹下的原始资源删除了,Unity会自动删除其meta文件,以及 metadata文件夹下相关的文件。

3)AtlasCache文件夹 和 ShaderCache文件夹

atlas和shader的缓存。

4)assetDatabase3

类AssetDatabase的数据支撑。

保证了mete被删除后,仍能创建回拥有相同guid的meta文件。

而删除了整个Library,当Library再次重建回来,被删的meta创建出来的guid就不再一样了。

3.ProjectSettings文件夹

此文件夹下是很多 .asset 文件,可以以文本的方式打开查看。

各个文件对应与工程中的 Project Settings 中的各个项。在Unity编辑器中设置了这些项目属性以后,其实都是存储在了这个文件夹下的.asset文件中。

ps:如果想查看Unity工程是用哪个版本打开的,除了直接用Unity打开查看以外,还可以看这个目录下的 ProjectVersion.txt 这个文件。

4.Temp

Library 和 Temp 都是缓存,可以删除,因此也不应该在版本控制之下。

5.Plugin/Android文件夹——用于Android打包

其中AndroidManifest.xml这个文件用来告诉android系统,这里面有关于APP的配置信息,你需要根据里面的设置的配置信息来运行APP的代码,显示界面。

xml包含标签,属性,值。AndroidManifest.xml常用的标签有(每个标签里的属性啊值啊就不介绍了):

<manifest>——根节点

          <application>——应用节点,必须有,作为<manifest>的子节点

                            <activity>,<provider>,<service> 描述应用的组件,作为<application>的子节点

          <uses-feature>——用户特征标签,描述应用所依赖的硬件或者软件条件。在应用商店搜索的时候进行过滤。

          <uses-permission>——用户权限标签,描述应用需要的权限

如果其下没有自己写的AndroidManifest,打包的时候Unity会用它默认的AndroidManifest(mac中存在 unity.app/Contents/PlaybackEngines/AndroidPlayer下面,当你在进行打包apk的时候,unity会拷贝该路径下的所有参数)。


三:重要路径

iOS

1.四个路径对应的平台下的路径

Application.dataPath

/var/containers/Bundle/Application/app sandbox/xxx.app/Data

也就是app安装路径app本身就在这里,此目录是只读的。

Application.streamingAssetsPath

/var/containers/Bundle/Application/app sandbox/xxx.app/Data/Raw

streamingAssetsPathdataPath下的Raw目录。

Application.persistentDataPath

/var/mobile/Containers/Data/Application/app sandbox/Documents

下面介绍独立数据存储目录Documents目录

Application.temporaryCachePath

/var/mobile/Containers/Data/Application/app sandbox/Library/Caches

下面介绍独立数据存储目录Library下的Caches子目录

2.app的独立数据存储目录

Documents文件夹 这个目录用于存储需要长期保存的数据,比如我们的热更新内容就写在这里。需要注意的是,iCloud会自动备份此目录,如果此目录下写入的内容较多,审核的可能会被苹果拒掉。
Library文件夹 Caches子目录

一个相对临时的目录,适合存放下载缓存的临时文件,空间不足时可能会被系统清除。

我把热更新的临时文件写在这里,等一个版本的所有内容更新完全后,再把内容转移到Documents目录

Preferences子目录 用于应用存储偏好设置,用NSUserDefaults读取或设置。
tmp文件夹 临时目录,存放应用运行时临时使用的数据

3.各路径对应的OC访问方法

app安装路径 [[NSBundle mainBundle] resourcePath]
app数据沙盒存储根目录 NSHomeDirectory()
Documents NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) 
Library NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) 
Caches NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)
tmp NSTemporaryDirectory()

Android

1.四个路径对应的平台下的路径

Application.dataPath

/data/app/package name-n/base.apk

也就是apk安装路径

Application.streamingAssetsPath jar:file:///data/app/package name-1/base.apk!/assets
Application.persistentDataPath

/storage/emulated/0/Android/data/package name/files  外部存储路径-私有目录-files目录

Application.temporaryCachePath

/storage/emulated/0/Android/data/package name/cache 外部存储路径-私有目录-cache目录

2.重要目录

各路径对应的Java访问方法

apk安装路径

/data/app/package name-n/base.apk

就是上面的dataPath返回的目录

AssetManager.open(String filename)
内存存储路径(InternalStorage)

/data/data/package name-n/,用户或其它app都不能访问

打开会发现里面有4个目录(需要root

cache 缓存目录,类似于iOS的Cache目录

context.getFilesDir().getPath()

或者

context.getCacheDir().getPath()

databases 数据库文件目录 
files 文件目录,类似于iOS的Documents目录 
shared_prefs,类似于iOS的Preferences目录,用于存放常用设置,比如Unity3D的PlayerPrefs就存放于此
外部存储路径(ExternalStorage)

在内置或外插的sd上,用户或其它app都可以访问

外部存储目录又分私有和公有目录

公有目录

DCIMMusicMoviesDownload这样系统创建的公共目录,

也有各自app创建的文件夹(在sd卡根目录下),卸载app数据依旧存在。

context.getExternalFilesDir().getPath()

或者

context.getExternalCacheDir().getPath()

私有目录

/storage/emulated/n/Android/data/package name/

打开可以看到里面有两个文件夹cachefiles

为什么跟内部存储目录重复了?

这是为了更大的存储空间,以防内存存储空间较小。

推荐把不需要隐私的、较大的数据存在这里,而需要隐私的或较小的数据存在内部存储空间。

3.APK安装路径

Android应用安装涉及到如下几个目录:

  • system/app——系统自带的应用程序,无法删除。
  • data/app ——用户程序安装的目录,有删除权限。安装时把apk文件复制到此目录。
  • data/data ——存放应用程序的数据。

data/data/{package_name}目录为应用的数据缓存目录,包含以下几个目录:

  • cache:
  • code_cache:
  • databases:sqlite数据
  • files:应用创建的文件缓存数据
  • lib:so类型的lib库
  • shared_prefs:存放sharedPreferences内容
  • data/dalvik-cache 将apk中的dex文件安装到dalvik-cache目录下(dex文件是dalvik虚拟机的可执行文件,其大小约为原始apk文件大小的四分之一)。

APP安装过程:

1.复制APK安装包到data/app目录下 ————data/app/xxx.apk

2.解压并扫描安装包,把dex文件(Dalvik字节码)保存到data/dalvik-cache目录,

3.在data/data 目录下创建对应的应用数据目录(文件夹的名字就是包名)——data/data/package name

APP卸载过程:

删除安装过程中在上述三个目录下创建的文件及目录。

注意:没有Root的手机是看不到data目录下的内容的;

4.APK清除和清除数据

原文  https://blog.csdn.net/u011016373/article/details/86304321

经过验证总结,得出如下结论:

1、清除缓存:

反射调用接口:PackageManager.deleteApplicationCacheFiles

它会清除以下项目:

A)清除data/data/{package_name}/cache/下的所有文件

B)清除data/data/{package_name}/code_cache/下的所有文件

C)清除mnt/sdcard/Android/data/{package_name}/下的cache文件夹

2、清除数据:

反射调用接口:ActivityManager.clearApplicationUserData

它会清除以下项目:

A)清除data/data/{package_name}/下的所有文件和文件夹(包括lib文件夹,PS:网上有人说lib文件夹和里面的内容不会被清除,经过验证,实际上也会清除)

B)清除mnt/sdcard/Android/data/当前包名的文件夹

C)清除mnt/sdcard/Android/media/当前包名的文件夹

D)清除{package_name}对应的app所有运行时权限的授权

E)清除所有通知,和该应用相关的所有URI授权(此项目为接口描述内容,未实际验证)

#但不会清除mnt/sdcard/Android/obb/{package_name}/下的内容

3、清除所有:

反射调用接口:PackageManager.freeStorageAndNotify

回调清除失败,不能清除任何数据。

附:

/mnt/sdcard/ = /storage/emulated/0/

/data/data/ = /data/user/0/

接口返回的目录具体地址:

getCacheDir=/data/user/0/{package_name}/cache

getFilesDir=/data/user/0/{package_name}/files

getDataDir=/data/user/0/{package_name}

getCodeCacheDir=/data/user/0/{package_name}/code_cache

getDir(“abcd”)=/data/user/0/{package_name}/app_abcd

getObbDir=/storage/emulated/0/Android/obb/{package_name}

getExternalCacheDir=/storage/emulated/0/Android/data/{package_name}/cache

getExternalFilesDir(“acbd”)=/storage/emulated/0/Android/data/{package_name}/files/abcd

getExternalMediaDirs[0]=/storage/emulated/0/Android/media/{package_name}

Windows:

Application.dataPath 应用的appname_Data/
Application.streamingAssetsPath

应用的appname_Data/StreamingAssets

Application.persistentDataPath

C:\Users\username\AppData\LocalLow\company name\product name

Application.temporaryCachePath

C:\Users\username\AppData\Local\Temp\company name\product name


四:Unity工具

1.查看unity里的二进制文件

.prefab   .anim  .mat .assets  以及 metadata下的文件

用 Unity\Editor\Data\Tools 安装路径下的 binary2text.exe 进行转化

2.查看Editor的日志

\AppData\Local\Unity\Editor


五:杂

Unity Window : ArgumentException: Object at index 0 is null

重新启动一下unity

如何下载 unitystore 上的资源

https://assetstore.unity.com/?locale=zh-CN。

加入收藏
然后Unity里面打开商店,到收藏的那里去下载。

参考:

项目分享ppt

https://blog.csdn.net/ynnmnm/article/details/52253674

https://blog.csdn.net/k46023/article/details/64439313

《Unity3D游戏开发》

Unity资产,特殊文件夹以及重要路径相关推荐

  1. Unity自定义创建文件夹

    文章目录 前言 Unity自定义创建文件夹 下载链接 前言 懒惰才是推动生产力发展的动力,在Unity每次创建脚本跟文件夹都要先右键然后点Create再点二级目录,索性我就直接给挪到一级目录. Uni ...

  2. Unity中专属文件夹介绍

    为什么突然会想起来写这篇文章呢,实在是因为在开发过程中遇到了一个很容易规避掉的问题却因为积累的少而被缠绕了近一个月.那就是因为Unity中特殊文件夹存放以及使用的问题.当时遇到这个问题的时候也花费了两 ...

  3. Python编程语言学习:两行代码输出根目录下所有子文件夹的绝对路径、相对路径

    Python编程语言学习:两行代码输出根目录下所有子文件夹的绝对路径.相对路径 目录 两行代码输出根目录下所有子文件夹的绝对路径.相对路径 两行代码输出根目录下所有子文件夹的绝对路径.相对路径 #Py ...

  4. asp.net 引入html文件路径问题,asp.net 网站获取一个文件或文件夹的绝对路径,使用方法Server.MapPath(项目根目下虚拟文件路径)实现...

    asp.net 网站获取一个文件或文件夹的绝对路径,使用方法Server.MapPath("项目根目下虚拟文件路径")实现,代码如下:using System; using Sys ...

  5. cmd进入文件夹/操作+解决路径中的空格问题

    目录 1 怎样回到C盘的根目录? 2 怎么回到上一级? 3 怎么一键跳转文件夹 4 当文件夹名中出现了空格怎么跳转? 报错!!!​编辑 解决方法: 5 怎么进入其他盘的根目录? 6 怎么打印该文件夹中 ...

  6. MATLAB中将文件夹添加到路径

    ** MATLAB中将文件夹添加到路径 打开matlab,运行程序时出错,提示找不到该文件夹怎么办? 运行显示找不到文件/文件夹颜色是浅色 用addpath添加文件夹: 1.首先要将matlab路径处 ...

  7. unity中删除文件夹残留空文件夹问题

    在unity中删除文件夹如果只调用Directory.Delete函数,会发现虽然可以将文件夹下的文件都删除掉,但是还会残留一个空文件夹,因为unity.meata文件没有删除,所以需要将文件夹对应的 ...

  8. 如何设置ftp服务器上传文件夹至不同路径,设置ftp服务器上传文件夹

    设置ftp服务器上传文件夹 内容精选 换一换 上传单个或多个本地文件或文件夹至OBS指定路径.待上传的文件可以是任何类型:文本文件.图片.视频等等.上传本地文件或文件夹时,请确保本地文件或文件夹在上传 ...

  9. win11系统用户名称为中文导致文件夹出现繁体字文件夹、系统路径配置错误修改教程(博主亲测,基于win11,系统文件保留)

    写在前面:很多人在拿到新电脑激活那会,命名就是简单的中文,但是中文命名电脑系统名称,会导致系统用户文件夹自动命名为中文,在后期使用中会导致c盘系统用户文件夹下面出现不知名繁体字文件夹,甚至有的朋友会出 ...

最新文章

  1. vmware nat模式网络不通_笨笨狗教你如何解决VMware虚拟机桥接网络不通问题?
  2. 多种语言《九九乘法表》荟萃:C、C++、C#、JavaScript、SQL、VB、VBA、Python
  3. C#写文本文件如何写入回车换行符?
  4. 深入分析 Flutter 渲染性能
  5. 任尔东西南北风(洛谷P2689题题解,Java语言描述)
  6. 离开载具_迷你世界 自制火箭试飞成功 飞行载具不负众望
  7. python的pip换源_[Python]Pip换源以及设置代理
  8. 判断入栈和出栈顺序是否一致
  9. 计算机网络(HTTP协议 与 HTTPS)
  10. Word、Excel操作技巧大全
  11. AS--创建项目(慢)和打开项目(慢)等需要注意的问题
  12. cas27647-84-3四羧基苯基卟啉锌;四羧基苯基锌卟啉TCPP-Zn(2+)/分子量:850.116160000001
  13. java编写数独_简单实现java数独游戏
  14. 为什么选择 GPU 云服务器
  15. uni-app跨端开发H5、微信小程序、支付宝小程序遇到的坑
  16. 日本美术学校有哪些,日本美术学校排名榜
  17. 在android上模拟ios阴影效果
  18. 基于MCS-51单片机路口红绿灯控制设计(含源码及Proteus布线图)
  19. npm run serve 运行会出现的一些错误
  20. 专业函数绘图软件Origin 7.5中文版

热门文章

  1. 缓存穿透,击穿,雪崩
  2. 广西区计算机二级vb net考试
  3. mapgis矢量化怎么打分数_MAPGIS制图以及矢量化过程之中一些实用的方法与技巧探讨(1)...
  4. java赵云主角兵器谱游戏_见过最牛的三国杀兵器谱专题论述
  5. win10:笔记本设置风扇转速
  6. css3移动端flex弹性盒子布局
  7. 图论计算机科学,图论在计算机科学中应用.ppt
  8. xp计算机管理下的服务显示不出来,在xp系统中,遇见电脑不显示摄像头图标怎么办?...
  9. 产业互联网下半场,SaaS平台的机遇与挑战
  10. gitlab 挖矿病毒处理