unity资源管理

unity资源一般,分为两个目录:Resources和StreamingAssets,下面我们就来了解下,这两个目录 如何使用,有什么区别。

Resources
放在Resources里边的资源,会全部打进包体,且会压缩。这里边的资源,也不能进行修改和更新。适合小游戏或单机游戏等。

一般放入那些资源?
1.整个游戏生命周期都存在,比如场景切换loading,固定的配置等
2.占用内存资源比较小:头像,道具底框等
3.不会热更的资源,不需要替换的资源
4.尽量不要在Resource放很多的资源,可减少包体的大小。

如何加载?
unity资源管理_第1张图片
传入参数:Resource.load 是文件名,Resources.LoadAll 既是文件名又是文件夹名。文件后缀 可以省略。

	//得到文件A
	Resources.Load("A");
	//得到Null
	Resources.Load<Texture2D>("A");
	//得到A文件夹下3贴图
	Resources.Load<Texture2D>("A/3");
	
	//得到 A文件和文件下3个子文件
	Resources.LoadAll("A");
	//得到 A文件夹下3贴图
	Resources.LoadAll<Texture2D>("A");
	
	//显式释放已加载的Asset资源
	Resources.UnloadAsset();
	//释放所有没有引用的资源
	Resources.UnloadUnusedAssets();

StreamingAssets
StreamingAssets文件夹下的文件,会原封不动的打入包体,主要存放一些二进制文件。它是可以从外部服务器更新并替换的。

目前老项目有一些 使用:AssetBundle,如果是新项目推荐使用Addressables。

1.AssetBundle
AssetBundle就是一个资源捆绑包,一个AssetBundle里可以包含多种Asset。

1.AssetBundle是一个压缩包包含模型、贴图、预制体、声音、甚至整个场景,可以在游戏运行的时候被加载;
2.AssetBundle自身保存着互相的依赖关系;
3.压缩包可以使用LZMA和LZ4压缩算法,减少包大小,更快的进行网络传输;
4.把一些可以下载内容放在AssetBundle里面,可以减少安装包的大小;

分组策略:

1.把经常更新的资源放在一个单独的包里面,跟不经常更新的包分离
2.把需要同时加载的资源放在一个包里面
3.可以把其他包共享的资源放在一个单独的包里面
4.把一些需要同时加载的小资源打包成一个包
5.如果对于一个同一个资源有两个版本,可以考虑通过后缀来区分 v1 v2 v3 unity3dv1 unity3dv2
Unity3D引擎对纹理的处理是智能的:不论你放入的是PNG,PSD还是TGA,它们都会被自动转换成Unity自己的Texture2D格式。

Texture2D纹理压缩
unity资源管理_第2张图片

	1.PC平台:
	DXT1和DXT5,有损压缩
	
	2.Android平台:
	ETC1压缩率高,但不支持透明贴图。ETC2支持透明贴图,内存会比ECT1高一点。
	
	3.IOS平台: 
	PVRTC压缩率高,性能好,存在失真情况。
	
	4.适合多有平台:
	NPOT:Non Power of Two Textures 无二次幂限制的纹理。
	
	RGBA16:中清晰中压缩,移动平台基本不会直接使用。
	对于需要放大、拉伸的图片,Unity原生对Dithering抖动的支持不好,会有非常明显的颗粒感。
	
	RGBA32:高清晰无压缩,内存占用大,移动平台基本不会直接使用。
	
	ASTC:压缩后画质好、自由度高,有多种格式可以选择4x4~12x12、不要求图片尺寸,推荐使用。
	需要设备GPU支持 OpenGL ES 3.1及以上。
	在不支持的设备上,贴图会解压成RGB(A),然后与压缩的贴图一起存储在内存中,会增加纹理加载时间和增加额外内存!

查看纹理压缩简介 DXT PVR ETC

unity资源管理_第3张图片
加载外部AB资源

//加载bundle方式1
UnityWebRequest request = UnityWebRequest.Get(uriPath);

byte[] results = request.downloadHandler.data;
AssetBundle ab = AssetBundle.LoadFromMemory(results);

//加载bundle方式2
UnityWebRequest request = UnityWebRequestAssetBundle.GetAssetBundle(uriPath);

AssetBundle ab = (request.downloadHandler as downloadHandlerAssetBundle).assetBundle;

2.Addressables
Addressables 是基于AssetBundle,进行了一些自动的改进。

Addressables基础学习,可参考这篇文章。
创建静态Groups ,增量更新,可参考这篇文章 文章2

如何导入Adressables?
1.打开Window -> AssetManager,找到Adressables,进行安装。
unity资源管理_第4张图片2.安装后,打开window -> Asset Management -> Adressables - Groups
刚开始,需要先创建个配置。
unity资源管理_第5张图片点击初始化按钮后,会在Assets目录生成AddressableAssetsData目录。

Addressable目录
AddressableAssetSettings配置:
unity资源管理_第6张图片
Profiles:
配置分组默认使用,本地和远程资源地址。
unity资源管理_第7张图片
Catalog:
热更资源列表文件,有这个文件,才知道每次需要更新那些文件。
Build Remove Catalog: 勾选才会生成Catalog版本文件,配套需要分组选择 Remote。
Disable Catalog Update on Startup:
勾选:禁止自动更新Catalog,需要自己写代码手动更新,更易于控制。
不勾选:自动更新,第一次调用Addressables.LoadAssetAsync等函数加载资源前,自动调用Addressables.InitializeAsync 和Addressables.CheckForCatalogUpdates 和 Addressables.UpdateCatalogs 进行资源更新,阻塞所有资源加载和实例化,直到完成。

Group Template:
在Assets/AddressableAssetsData/AssetGroupTemplates目录右键
Create->Addressables->GroupTemplates/BlankGroupTemplate创建新模板
注意:此目录下有默认模板Packed Assets,也可修改默认模板
unity资源管理_第8张图片
Content Packing & Loading
BuildPath: Bundle文件生成到那个位置
Load Path:运行时,加载的地址
最终打包后,这个Group的位置信息,加载地址,还会被catalog记录.

Include In Build: 勾选:打包时,build时资源会导出。

content update restriction:
CannotChangePostRelease :静态组,发布之后不允许被修改,有新资源可增量更新,新创建一个资源上传,保留远程旧资源。
CanChangePostRelease: 动态组,每次发布时都会全量更新【直接替换旧资源】。

Bundle Mode:
PackTogether:一个组一个bundle文件,一般不需要这样。
PackSeparately:组内每个资源一个bundle文件,更新时那个有变化就更新那个。
PackTogetherByLabel:组内每个资源标签一样的,生成一个bundle文件。

Bundle Nameing Mode:
Append hash to filename: 在bundle文件名字后面追加一个hash码。
Use hash of filename: bundle文件名字会变成hash码,对比文件不是很容易,根据情况可不用。

Cache Clear Behavior:
Clear When Space Is Needed In Cache:缓存中需要空间时清除,一般比较适合Local
Clear When New Version Loaded:当有新版本时,删除旧版本,一般比较适合Remote

在AssetSettings配置添加模板:
unity资源管理_第9张图片
Addressable Group面板

这个是 最重要的面板,大部分分组工作在这里操作。

unity资源管理_第10张图片
分组设置:移除,简化名字,设置为默认,指定Inspect位置,重命名,创建新组

unity资源管理_第11张图片

ImportSetting
用这个插件,来管理自己的分组资源,会比较方便。

导入AddressableImport插件
unity资源管理_第12张图片
设置Addressable Import Setting,可以增加多个规则,每个规则就是一个分组。规则根据项目需求添加后,点击保存。

unity资源管理_第13张图片保存后,右键Check Folders,导入分组,一般上线发版前,执行一次,后续使用增量更新。有新资源时,可在新资源目录,右键执行 reimport,如果无反映可在 Assets根目录下执行 reimport。

unity资源管理_第14张图片
设置为默认的分组,在inspector面板勾选addressable,会将资源放入到默认分组。
unity资源管理_第15张图片Local Build Path:使用默认的就行,一般会生成在:项目\Library\com.unity.addressables\aa\下面,无需更改,发布打包时,会将此目录的文件复制到Assets\StreamingAssets下面。

生成Bundle文件
第一次发布时: 执行一次 Build -> New Build -> Default Build Script。会生成 Catalog.hash 和Catalog.json文件。
第二次发布时: 执行Build ->Update a Previous Build ,否则APP要重新发布。

增量更新
建议Group使用 CannotChangePostRelease

	1.点击Group面板的Tools->CheckForContentUpdateRestrictions
	2.在弹出的窗口中,选择build的平台选中对应的.bin文件
	3.弹出的窗口中看到当前修改过的内容(无内容修改则为空),点击ApplyChanges
	4.若有静态资源修改,Group面板会自动创建一个Content Update分组,静态组中修改过的内容会移动到这个分组,默认为Remote。
	5. 点击Group面板的Build->Update a Previous Build,在弹出的窗口中仍然选中第2步的.bin文件。
	6. Build完成后,手动将RemoteBuildPath下的文件拷贝到指定的服务器即可。
    
	注意事项:
	1.不要手动在Group面板修改Group的内容
	2.在构建apk包后不要再随意执行Import插件的CheckFolder操作,否则在后续的增量更新中会将导致更新内容变大。
	3.当在后续更新中新增ImportSetting规则时,应在规则匹配的目录下执行CheckFolder操作。

全量更新:
建议Group使用 CanChangePostRelease

	1. Group面板Build->Update a Previous Build,在弹出的窗口中选中上次.bin文件。
  2. Build完成后,手动将RemoteBuildPath下的文件拷贝到指定的服务器即可。

打出的bundle文件:
优先级: 图集 ->资源 ->皮肤,优先打入图集,其次是资源,最后才是prefab。

如果只导出prefab,资源会包含在prefab对应的bundle文件,但是这个资源动态使用Addressables.LoadAssetsAsync加载时会找不到。

加载prefab对应的bundle文件时,若是有引用图集,会自动下载引用图集
unity资源管理_第16张图片

你可能感兴趣的:(unity,unity,游戏引擎)