Unity调皮的AssetBundle如何管理

本文探讨了Unity中AssetBundle的管理,特别是在Unity 5.x版本后的新打包方案。作者分享了如何通过面向对象的设计封装AssetBundle加载管理类,以实现更便捷的资源加载和调试,包括加载、调试、异步、垃圾回收和路由五个部分。文中介绍了统一返回追踪对象的加载接口,以简化同步和异步加载,并提供了简单的函数式接口。此外,还提到了实时调试和错误处理的重要性和ResourceModule在资源热更新策略中的作用。
摘要由CSDN通过智能技术生成

在Unity 5.x之前的版本,3.x和4.x,AssetBundle是一个非常难用的功能。你不但要操心资源的管理规范,还要写大量的代码控制的它们的打包,更要命的是,打包不但速度慢,还有数之不尽的坑。相信不少开发团队,都在AssetBundle上花费过不少精力和时间。

我经历过了4个不同的中大型游戏规模的Asset Bundle打包,躺过其中相当多的坑,逐渐的开始掌握它的脾性。回头仔细想一下,其实很多坑完全是没有必要的,但是前提是在设计之初给予相对的重视,提炼统一的方案,就不必说导致后期失控的状况。

在Unity 5.x里,官方推出了一个全新的打包方案,对于程序员而言,可以仅用一行代码打包所有的AssetBundle。尽管它里面还是有一些坑,可是却大大减轻了开发团队的工作。打包方式变简单了,大家可以集中精力研究怎么更好的去把这些Asset Bundle加载起来了。

更好的方式去加载Asset Bundle

Asset Bundle加载资源的API非常的简单,核心其实只是两个函数,一个同步和一个异步。


// 同步加载,直接返回AssetBundle
AssetBundle.LoadFromFile(path);
// 异步加载,返回AssetBundleCreateRequest
AssetBundle.LoadFromFileAsync(path);

相信每一个游戏开发团队都在官方的这些AssetBundle加载API基础上,封装出自己的加载管理类,这几乎是必须的。封装的方式千奇百怪,怎么样去封装,去封装的比较好?

接下来我所讲述的是一种模仿面向对象的AssetBundle加载管理类封装方式,实现方便加载的同时,又可以更容易的进行实时调试。

这种基于面向对象的方式来设计的AssetBundle加载管理器,我们给他一个名字叫ResourceModule,方便下文讲述。它的主要目的是为了让开发者在方便的加载资源的同时,提供方便的实时调试功能,并且你会在过程中了解到资源文件的热更新策略。

下边将会分成五个部分来介绍ResourceModule:加载、调试、异步、垃圾回收、路由。

加载器——基于追踪对象

// 同步加载,return 直接返回AssetBundle对象
AssetBundle.LoadFromFile(path);  
// 异步加载,return 返回AssetBundleCreateRequest对象
AssetBundle.LoadFromFileAsync(path); 

在Unity的标准Asset Bundle加载接口中,同步加载返回了行为结果,异步加载则返回了行为追踪对象。具体来说,同步加载,直接就返回了资源的AssetBundle;异步加载,则返回了异步加载的追踪对象AssetBundleCreateRequest。追踪对象,用于之后进行资源异步加载情况跟踪,被协程轮询判断是否已经异步加载完毕,若完成了可从追踪对象里获取加载资源。

由于同步和异步的加载API不一样,在项目实际应用时,往往没有统一的加载接口。要避免这种情况,可以统一加载行为,都返回追踪对象。这也是ResourceModule加载方式的核心。

函数式接口

在ResourceModule里,提供了两个最简化的加载Asset Bundle API,看上去就跟Resources.Load一样简单。

// 同步方式
var loader = ResourceModule.LoadBundle(path);
var ab = loader.Asset; // get UnityEngine.Object sync

// 异步方式
var loaderAsync = ResourceModule.LoadBundleAsync(path);
var abAsync = loaderAsync.Asset; // null asset, async loading.
while(!loaderAsync.IsFinished)
{
    yield return null;    // 协程等待
}
abAsync = loaderAsync.Asset; // get UnityEngine.Object async

这里的函数式接口跟官方的是不一样的地方:ResourceModule的函数式接口的返回值,将始终还是一个AbstractResourceLoader对象,也就是“追踪对象”——对于异步加载,使用追踪对象,可以判断异步加载的进度并获取加载后的资源;对于同步加载,使用追踪对象立即获取资源;它也提供错误处理信息;并且后续所讲及的实时调试,也是基于这个追踪对象。

两个接口的返回值类型是一样的。

abstract class AbstractResourceLoader {
    bool IsComplete {get; set;}
    bool IsError {get; set;}
    object ResultObject;
    // .......
}

看上去,Asset Bundle的加载接口很简单。但本质来说,这只是接下来Loader对象式加载的一个使用简化。

更多unity2018的功能介绍请到paws3d爪爪学院查找。链接https://www.paws3d.com/learn/,也可以加入unity学习讨论群935714213

近期更有资深开发人士直播分享unity开发经验,详情请进入官网或加入QQ群了解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值