思考并回答以下问题:
本文将介绍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.GUIDToAssetPath和AssetDatabase.AssetPathToGUID中可以进行互转。
GUID保持不变的情况:移动、重命名、改动资源文件,都对GUID没有影响,GUID还是指向这个资源文件。
GUID改变的情况:注意不要随意删除资源文件相关的meta文件。如果删除了meta文件,unity会认为原始的资源文件被删除了,并给此资源重新生成一个新的GUID。(为什么有时候场景中资源的引用会突然断开)
2)导入设置(default import setting):可以在meta文件中找一下在导入设置中的对应项目。
根据不同的文件类型,它的数据是不同的ImportSetting数据,比如上面的NativeFormatImporter、ModelImporter、AudioImporter等等。只要对照Inspector面板中的条目,都可以看懂每一行的意义。所以假如我们把一个文件和这个文件的Meta文件从一个Unity工程复制到另一个Unity工程中,它的配置是不会变的
关于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文件夹
存放的是当前工程的程序集:
其依赖关系,分成运行时程序集和编辑器程序集(各自都要依赖于firstpass,所以取名叫first)
编辑器程序集:是在 Editor 目录里的代码构成的。
运行时程序集:打包的时候只会构建运行时的程序集。
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 都是缓存,可以删除,因此也不应该在版本控制之下。
三:重要路径
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
streamingAssetsPath是dataPath下的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都可以访问。
外部存储目录又分私有和公有目录
公有目录
有DCIM、Music、Movies、Download这样系统创建的公共目录,
也有各自app创建的文件夹(在sd卡根目录下),卸载app数据依旧存在。
context.getExternalFilesDir().getPath()
或者
context.getExternalCacheDir().getPath()
私有目录
/storage/emulated/n/Android/data/package name/
打开可以看到里面有两个文件夹cache和files。
为什么跟内部存储目录重复了?
这是为了更大的存储空间,以防内存存储空间较小。
推荐把不需要隐私的、较大的数据存在这里,而需要隐私的或较小的数据存在内部存储空间。
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
版权声明:本文为CSDN博主「ivy_0709」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u012138730/article/details/81143413