unity资源一般,分为两个目录:Resources和StreamingAssets,下面我们就来了解下,这两个目录 如何使用,有什么区别。
Resources
放在Resources里边的资源,会全部打进包体,且会压缩。这里边的资源,也不能进行修改和更新。适合小游戏或单机游戏等。
一般放入那些资源?
1.整个游戏生命周期都存在,比如场景切换loading,固定的配置等
2.占用内存资源比较小:头像,道具底框等
3.不会热更的资源,不需要替换的资源
4.尽量不要在Resource放很多的资源,可减少包体的大小。
如何加载?
传入参数: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纹理压缩
登录后复制
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
加载外部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,进行安装。
2.安装后,打开window -> Asset Management -> Adressables - Groups
刚开始,需要先创建个配置。
点击初始化按钮后,会在Assets目录生成AddressableAssetsData目录。Addressable目录
AddressableAssetSettings配置:
Profiles:
配置分组默认使用,本地和远程资源地址。
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,也可修改默认模板
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配置添加模板:
Addressable Group面板
这个是 最重要的面板,大部分分组工作在这里操作。
分组设置:移除,简化名字,设置为默认,指定Inspect位置,重命名,创建新组
ImportSetting
用这个插件,来管理自己的分组资源,会比较方便。
导入 AddressableImport插件
设置Addressable Import Setting,可以增加多个规则,每个规则就是一个分组。规则根据项目需求添加后,点击保存。
保存后,右键Check Folders,导入分组,一般上线发版前,执行一次,后续使用增量更新。有新资源时,可在新资源目录,右键执行 reimport,如果无反映可在 Assets根目录下执行 reimport。
设置为默认的分组,在inspector面板勾选addressable,会将资源放入到默认分组。
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文件时,若是有引用图集,会自动下载引用图集
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删