UGUI打包策略
- 一个UI模块对应一个图集
- 一个UI模块的图集打一个AB包
- 一个图集打成多个包加载后会造成冗余
- 一个图集有多个Page,虽然打成了一个AB包,但加载后是多个贴图。但使用起来就像是一个贴图一样。
- 一个UI模块的若干预设可以分别打包
- 公共图集打若干AB包
注意
- 一个AB包重复加载多次,则其中的Asset就会冗余几次
所以要做好加载管理,避免AB的重复加载,同时也要避免资源的重复打包
资源卸载顺序
- Destroy
- ab.Unload(true)
- Resources.UnloadUnusedAssets()
如果在ab.Unload前执行此方法可能会无效,因为ab仍在引用assets。
其它
- 如果我有一个Prefab,它的Dependencies都在Resources文件夹中,那么,当我在AssetBundle打包时,只打包这个Prefab(不指定BuildAssetBundleOptions.CompleteAssets和BuildAssetBundleOptions.CollectDependencies)的话,这个Prefab能够正确实例化吗?
这是不能正确实例化的,因为AssetBundle中的资源和Resource文件夹下资源是不会建立依赖关系的(脚本除外,因为开启BuildAssetBundleOptions.CollectDependencies 时,脚本依然不会打包到AssetBundle中)。所以会出现Mesh、Material等的丢失。
- 获取所有AssetBundleName
var names = AssetDatabase.GetAllAssetBundleNames();
foreach (var name in names)
Debug.Log ("AssetBundle: " + name);
- 监听资源的AssetBundleName变化
using UnityEngine;
using UnityEditor;
public class MyPostprocessor : AssetPostprocessor {
void OnPostprocessAssetbundleNameChanged ( string path,
string previous, string next) {
Debug.Log("AB: " + path + " old: " + previous + " new: " + next);
}
}
- Editor下可以加载任意平台下的AssetBundle,此外必须加载对应平台下的AssetBundle,否则会报以下错误
The file can not be loaded because it was created for another build target
that is not compatible with this platform.
- 通过AssetBundle加载的材质,Shader出现InternalErrorShader的情况
- 被依赖的Shader没有在材质之前加载
- 被依赖的Shader过早被Unload