Unity AssetBundle,AssetBundleBrower,AssetBundleGraphy总结

本文总结了Unity中AssetBundle的使用经验,包括AssetBundleBrowser和AssetBundleGraphy的优缺点,提出了针对大型项目的AssetBundle管理策略,强调了资源回收的重要性,并详细描述了资源丢失和泄露的常见bug及解决方案。
摘要由CSDN通过智能技术生成

前言

首先,本人(倒立大帝)能力有限,所讲的不一定对,或者不是最好的方法,如果大家有更好的办法,非常欢迎留言或者给我发邮件(kavengw#gmail.com).

首先附上链接

AssetBundleBrowser
AssetBundleGraphy

代码修改文件Assetbundle

AssetImporter importer = AssetImporter.GetAtPath(filePath);
importer.assetBundleName = bundleName;

建议

个人而言,AssetBundleGraphy无疑是鸡肋的,只适合小型项目管理,对于一个大型项目,如果你需要几十或者几百的bundle时,你去一个一个连线,或者让你们美术,策划去连线,那无疑是愚蠢的。

对于我们项目而言,我们目前测试版已经有13个角色,将每个角色打一个bundle是我能想到的一个比较好的选择。每个角色都有模型,音效,特效等,同时你还会有配置表,lua脚本等。

个人做法:

  1. 对于一些文本资源,例如xml,lua等,直接遍历所在文件夹的所有文件修改为统一的assetbundle,由于本人游戏有几个地图都是生成xml的,之后再将特殊的xml重新赋值。个人认为xml,lua放置在一个目录下利于管理
  2. 根据配置表读取每个角色用到的模型,音效,特效来设置资源对应的Assetbundle
  3. 生成一个Dictionary保存模型对应的AssetImporter,避免公用特效和音效被打包进入别的Assetbundle,导致资源丢失。
  4. 通过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。所以我在内存中的这张胜利的图片不会被释放,同时我将游戏界面的所有图片合在一张大图上,所以这一整张图片都不会被释放,由于某种原因,这张大图在切换场景时没有被释放。所以当我再次进入游戏后,重新加载游戏场景时,这张大图又被加载进来。结果就是每玩一关就有一张这图被创建在内存中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值