前言
首先,本人(倒立大帝)能力有限,所讲的不一定对,或者不是最好的方法,如果大家有更好的办法,非常欢迎留言或者给我发邮件(kavengw#gmail.com).
首先附上链接
AssetBundleBrowser
AssetBundleGraphy
代码修改文件Assetbundle
AssetImporter importer = AssetImporter.GetAtPath(filePath);
importer.assetBundleName = bundleName;
建议
个人而言,AssetBundleGraphy无疑是鸡肋的,只适合小型项目管理,对于一个大型项目,如果你需要几十或者几百的bundle时,你去一个一个连线,或者让你们美术,策划去连线,那无疑是愚蠢的。
对于我们项目而言,我们目前测试版已经有13个角色,将每个角色打一个bundle是我能想到的一个比较好的选择。每个角色都有模型,音效,特效等,同时你还会有配置表,lua脚本等。
个人做法:
- 对于一些文本资源,例如xml,lua等,直接遍历所在文件夹的所有文件修改为统一的assetbundle,由于本人游戏有几个地图都是生成xml的,之后再将特殊的xml重新赋值。个人认为xml,lua放置在一个目录下利于管理
- 根据配置表读取每个角色用到的模型,音效,特效来设置资源对应的Assetbundle
- 生成一个Dictionary保存模型对应的AssetImporter,避免公用特效和音效被打包进入别的Assetbundle,导致资源丢失。
- 通过AssetbundleBrower复查bundle之间的引用关系以及资源包内的文件。个人认为这一步才是最重要的!!
回收
俗话说的好,请神容易送神难。
//false指释放AssetBundle文件的内存镜像,不包含Load创建的Asset内存对象
AssetBundle.Unload(false);
//true全部释放
AssetBundle.Unload(true);
如果一个Assetbundle被不恰当的卸载了,可能会引起Object在内存中重复存在。也可能会引起资源的丢失。碰巧的是这两种情况我都遇到了。
资源丢失bug
游戏中每个角色肯定会有血条,由于每个角色的高度都不一样,所以我们的血条位置都是由策划在角色的Prefab中配置的,血条资源当然是打在一个游戏通用资源包中。曾近出现2个问题导致血条的图片丢失。
1. 由于先加载角色直接读取prefab再加载通用包
2. 由于先通用包然后只处理通用资源包的Prefab而没有保存sprite就直接释放了
资源泄露bug
这里引用我之前放下的一个严重bug来解释一下,在我的游戏结束界面有3张图,一张失败,一张胜利,一张平局。毫无疑问,这三张是通过代码来控制的。在我加载完成之后,我使用AssetBundle.Unload(false)来释放这个AssetBundle。所以我在内存中的这张胜利的图片不会被释放,同时我将游戏界面的所有图片合在一张大图上,所以这一整张图片都不会被释放,由于某种原因,这张大图在切换场景时没有被释放。所以当我再次进入游戏后,重新加载游戏场景时,这张大图又被加载进来。结果就是每玩一关就有一张这图被创建在内存中。