从 v2.4 开始,Creator 正式支持 Asset Bundle 功能。Asset Bundle 可以按需求随意放置,比如可以放在远程服务器、本地、或者小游戏平台的分包中。也可以跨项目复用,用于加载子项目中的 Asset Bundle。

加载Asset Bundle

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 加载Bundle  异步操作 
cc.assetManager.loadBundle('bundle1', (err, bundle) => {
// err表示发生的错误,null时表示成功
// bundle已加载的bundle包

});
// 通过 Asset Bundle 在用户空间中的路径进行加载
// 原生平台
// jsb.fileUtils.getWritablePath() 表示获取文件的可写目录,是一个内部存储的目录
cc.assetManager.loadBundle(jsb.fileUtils.getWritablePath() + '/myBundleName', (err, bundle) => {
// ...
});

// 微信小游戏平台
// wx.env.USER_DATA_PATH下载成功后保存的路径
cc.assetManager.loadBundle(wx.env.USER_DATA_PATH + '/pathToBundle/bundleName', (err, bundle) => {
// ...
});

加载 Asset Bundle 中的资源

在 Asset Bundle 加载完成后,返回了一个 cc.AssetManager.Bundle 类的实例。我们可以通过实例上的 load 方法来加载 Asset Bundle 中的资源,此方法的参数与 cc.resources.load 相同,只需要传入资源相对 Asset Bundle 的路径即可。但需要注意的是,路径的结尾处 不能 包含文件扩展名。

  • 单独加载
  • load() 是通过相对路径加载分包中的资源。路径是相对分包文件夹路径的相对路径
  • 携带四个参数 paths 加载文件的路径、type 加载文件的类型如cc.Prefab、onProgress可选参数、onComplete回调函数,加载成功或失败时回调
1
2
3
4
5
6
// 加载预制体
// 加载 Prefab
// bundle 表示已经加载的bundle包
bundle.load(`prefab`, cc.Prefab, (err, prefab) => {
//
});
  • 批量加载
  • loadDir() 加载目标文件夹中的所有资源, 注意:路径中只能使用斜杠,反斜杠将停止工作
  • 携带四个参数 dir分包中文件夹名称、type 加载文件的类型如cc.Prefab可选、onProgress可选参数、onComplete回调函数,加载成功或失败时回调
1
2
3
4
5
6
7
8
9
// 加载 textures 目录下的所有资源
bundle.loadDir("textures", (err, assets) => {
// ...
});

// 加载 textures 目录下的所有 Texture 资源
bundle.loadDir("textures", cc.Texture2D, (err, assets) => {
// ...
});
  • 加载bundle中的场景
  • loadScene() 通过场景名称加载分包中的场景
  • 携带四个参数 sceneName要加载的场景名称、options 一些可选参数、onProgress加载进度回调函数(finis已完成的项目数 ,total 项目的总数,item最新的请求项)可选、onComplete回调函数,将在场景启动后调用
1
2
3
4
5
// 加载bundle分包中test场景
bundle.loadScene('test', (err, scene) => {
// 加载完成后运行该场景
cc.director.runScene(scene);
});

获取 Asset Bundle

当 Asset Bundle 被加载过之后,会被缓存下来,此时开发者可以使用 Asset Bundle 名称来获取该 bundle

  • getBundle() 获取已加载的分包
  • 携带一个参数 name 分包名称
1
2
3
4
5
6
7

let isBundle = cc.assetManager.getBundle('bundle');
if ( isBundle ) {
// 表示已经加载过可直接加载其中的资源
} else {
// 表示没有加载需要先加载
}