当前位置:首页 > 英文周记 > 正文内容

assetbundle「assetbundles」

更新时间:2026-07-18 19:24:22 周记网3年前 (2023-03-01)英文周记123

unity 为什么要用assetbundle

主要是为了降低游戏的大小。。

通常在开发的时候,不会直接把所有素材都打包在客户端里。。而是事先放在服务器上。。

等需要的时候,再把服务器上的资源下载到客户端。。。。这个过程有个专用的名词,叫做热更新。。。这样就能使客户端变得比较小。

assetbundle「assetbundles」

assetbundle的作用就类似序列化,为了使素材能够通过网络传播。。所以需要事先把素材打包成assetbundle,这样就可以通过WWW类把资源从服务器下载到客户端。

AssetBundle增量打包

最近在给项目做增量打包的功能,之前也有其他项目碰到增量打包差异过大的问题。

这里记录分享下做法与思考过程,主要解决以下两个问题:

首先AssetBundle打包可以概括把给定的资源打成一个或多个AssetBundle。每个AssetBundle包含一个或多个资源,AssetBundle之间存在依赖关系,具体的打包规则应该是每个项目根据资源进行配置的。

第一次全包,相当于给所有的资源文件分配归属AB。第二次增量打包,不仅要对新增的文件分配归属AB,还要把已经删除的文件从AB里面移除,最后确定修改的AB文件列表。Unity 5.0以后的AB打包接口已经支持增量打包,直接使用就可以了。

增量包一致性是指我们在不修改任何资源的情况下,增量包与首包的一致性。正常的情况下如果不修改任何资源,两次打包出来的包应该保持一致。然而由于项目做了较多的预处理,最后发现差异非常大。

通过分析打包日志,发现项目在打包之前的预处理环节处理的资源不能保持一致性。包括CreateAsset,CreatePrefab,ReplacePrefab,SaveScene等行为。对于新创建的资源,由于guid发生变化会导致增量包不一致。对于Prefab和Scene资源,则是尽管Object并没有发生变化,但是Object与Object之间的顺序会发生变化,这也会导致增量包不一致。

最后问题就变成了解决预处理环节资源的一致性问题。

如果把所有预处理修改的资源都提交入库,这样应该就可以解决增量包一致性的问题了。但并不是所有的资源都能这样直接入库,而且自动化环节变手工环节还会有一些其他问题。 这里把修改后资源提交到一个其他库就避免了冲突问题。

然后修改预处理环节的逻辑为,如果资源修改了重新执行,如果资源无修改则直接拷贝库里文件。对于meta文件,则应该不过是否重新生成,都要复用避免guid不一致的问题。再设计一个全局开关来控制新的增量逻辑,如果预处理规则修改了,则可以全部重新生成。正常已经上线是不允许做这样大的改动,不过日常开发过程中修改预处理规则是很常见的,所以需要支持。

修改的资源相当于**了一份,为了避免重新生成guid,这些资源应该放在Assets目录之外,对于生成出来的资源则没有这方面的限制。

在做完第一步,保持了原始资源的一致性后,增量打包这个事情可以算搞定了。由于资源没有发生变化,所以即使把所有资源都重新打一次包最后的结果也是一样的。不过既然是做增量打包,我们还是要考虑到整包的构建时间过长。所以这里要解决的问题就是打包时间优化。

首先,这里还是包含了两个环节,一个是资源预处理,另外个是资源打包。前面已经讨论过为了资源一致性,我们需要把资源保存下来,没有修改的资源不需要重新生成。这里为节省打包时间,其实做出了巨大贡献。在剖析打包时间的时候,发现ReplacePrefab,SaveScene这些Unity API调用占用了大量的时间。这里并没有多少办法可以优化这些API调用的时间,一个显而易见的好办法就是少调用几次。

对于如何获取修改的资源文件列表,可以通过svn,git等版本控制软件获取。在得到了文件修改列表之后,我们也知道了预处理环节中哪些资源是可以复用的,哪些资源是需要重新执行预处理的。在后面的打包环节也同样是利用这个资源差异列表来做增量。

打包环节的增量就是确定哪些包需要打,这里是根据差异列表计算出哪些AB需要打包。由于AB之间会有依赖关系,所以要递归算出最后需要打包的AB列表。然后根据AB打包列表按打包规则顺序进行打包即可。

资源一致性这个问题可能是大部分项目打包过程中会碰到的,因为Unity没有解决这个问题。这里通过自己保存资源以及维护资源修改列表来解决这个问题。顺便这个做法还能节省很多的构建时间,做增量预处理,一举两得。

其实是在思考过程中突然意识到其实是要做这样一件事情,想到后整个事情并不复杂。

unity3d开发2d游戏中Assetbundle有什么作用

在unity3d开发2d游戏中,Assetbundle 是Unity Pro提供提供的功能,它可以把多个游戏对象或者资源二进制文件封装到Assetbundle中,提供了封装与解包的方法使用起来很便利。

Resources是动态内部调用,Resources在编辑环境下是project窗口的一个文件夹,调用里面的资源,可以用Resources类,比如Resources.Load,打包后这个文件夹是不存在的,会统一生成assets资源,AssetBundle 是外部调用,要用AssetBundle 首先要先。

开发过程中哪些情况需要使用AssetBundle

开发过程中需要使用AssetBundle的地方:1、客户端 当运行, 请求PHP服务器端遍历某个文件夹或者数据库,返回有多少资源。 当客户端接收到反馈、 根据资源的多少、 实例化多少个Button。 Button携带点击事件之加载网络模型。 就相当于服务器里放了很多 资源、相当于一种优化、 当 客户端请求的时候, 就加载、 否则就不加载。 不然的话 打包出来的程序很大很大。开发过程中哪些情况需要使用AssetBundle

unity 怎么生成assetbundle

需要写脚本的,脚本如下

[MenuItem("Custom Editor/Create AssetBunldes Main")]

static void CreateAssetBunldesMain ()

{

//获取在Project视图中选择的所有游戏对象

Object[] SelectedAsset = Selection.GetFiltered (typeof(Object), SelectionMode.DeepAssets);

//遍历所有的游戏对象

foreach (Object obj in SelectedAsset)

{

string sourcePath = AssetDatabase.GetAssetPath (obj);

//本地测试:建议最后将Assetbundle放在StreamingAssets文件夹下,如果没有就创建一个,因为移动平台下只能读取这个路径

//StreamingAssets是只读路径,不能写入

//服务器下载:就不需要放在这里,服务器上客户端用www类进行下载。

string targetPath = Application.dataPath + "/StreamingAssets/" + obj.name + ".assetbundle";

if (BuildPipeline.BuildAssetBundle (obj, null, targetPath, BuildAssetBundleOptions.CollectDependencies)) {

Debug.Log(obj.name +"资源打包成功");

}

else

{

Debug.Log(obj.name +"资源打包失败");

}

}

//刷新编辑器

AssetDatabase.Refresh ();

}

可以看mono雨松的文章

如果打包为.unity3d 文件,把上述的打包文件后缀名".assetbundle"改为“.unity3d” 即可的

如何灵活使用AssetBundle管理CSS样式及JS脚本

namespace app\assets;

use yii\web\AssetBundle;

class AppAsset extends AssetBundle {

灵活使用AssetBundle管理CSS样式及JS脚本

public $basePath = '@webroot';

public $baseUrl = '@web';

public $css = [

'public/skin/default_skin/css/theme.css',

];

public $js = [

'public/vendor/jquery/jquery-1.11.1.min.js',

'public/vendor/jquery/jquery_ui/jquery-ui.min.js',

'public/js/bootstrap/bootstrap.min.js',

];

//依赖包

public $depends = [

//这里写你的依赖包即可,没有就别写

];

//导入当前页的功能js文件,注意加载顺序,这个应该最后调用

public static function addPageScript($view, $jsfile) {

$view-registerJsFile($jsfile, [AppAsset::className(), 'depends' = 'app\assets\AppAsset']);

标签: assetbundle

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。