Cocos学习之资源动态加载
目录
- **前言**
- 🌐 **阶段4-4:资源动态加载**
- **核心概念**
- **案例1:动态加载resources图片**
- **案例2:使用Asset Bundle加载场景**
- **案例3:预加载远程资源**
- **总结**
- 📝 **本阶段任务**
- **常见问题预解答**:
前言
在现代游戏开发中,高效的资源管理直接影响用户体验与产品性能。本文针对Cocos Creator引擎,解析其资源动态加载的核心机制,通过远程资源加载、场景分包加载、热更新三个典型场景,演示如何实现资源的高效加载与更新策略,为开发者提供优化内存与网络使用的实践方案。
🌐 阶段4-4:资源动态加载
核心概念
- 加载策略
- 静态加载:
@property
拖拽绑定(适合基础资源) - 动态加载:运行时按需加载(减少初始包体)
- 静态加载:
- 资源分类
resources
目录:打包时自动包含,需通过路径加载远程资源
:通过URL加载(需处理跨域和缓存)- Asset Bundle:模块化资源包(热更新基础)
案例1:动态加载resources图片
目标:根据配置表动态加载角色头像。
步骤:
-
资源准备
- 将头像图片放入
assets/resources/textures
目录 - 创建配置表
roleConfig.json
:
{"avatar": "textures/hero_avatar.png" }
- 将头像图片放入
-
脚本实现
import { _decorator, Component, Sprite, resources } from 'cc'; const { ccclass, property } = _decorator;@ccclass('DynamicLoad') export class DynamicLoad extends Component {async onLoad() {// 加载配置表const config = await this.loadJson('roleConfig');// 加载头像图片const avatar = await this.loadTexture(config.avatar);// 设置Sprite组件this.node.getComponent(Sprite)!.spriteFrame = avatar;}private loadJson(path: string): Promise<any> {return new Promise((resolve, reject) => {resources.load(path, (err, asset) => {err ? reject(err) : resolve(asset.json);});});}private loadTexture(path: string): Promise<SpriteFrame> {return new Promise((resolve, reject) => {resources.load(path, SpriteFrame, (err, asset) => {err ? reject(err) : resolve(asset);});});} }
案例2:使用Asset Bundle加载场景
目标:将关卡场景打包为AB包,运行时动态加载。
操作流程:
-
创建Asset Bundle
- 在资源管理器右键
assets
→ 新建 → Asset Bundle → 命名level1
- 将关卡场景拖入该Bundle
- 在资源管理器右键
-
打包配置
- 菜单栏:项目 → 构建发布 → 勾选
level1
Bundle
- 菜单栏:项目 → 构建发布 → 勾选
-
运行时加载
import { assetManager } from 'cc';async loadLevelBundle() {// 加载AB包(支持远程URL)const bundle = await assetManager.loadBundle('level1');// 加载场景const scene = await bundle.loadScene('level1_fire');// 切换场景director.runScene(scene); }
案例3:预加载远程资源
目标:显示加载进度条,预下载远程资源包。
代码:
// 进度条控制
updateProgress(loaded: number, total: number) {const percent = (loaded / total * 100).toFixed(1);this.progressBar.getComponent(Label)!.string = `${percent}%`;
}// 预加载远程AB包
async preloadRemoteBundle() {const bundleUrl = 'https://your-cdn.com/bundles/weapons';const options = {version: '1.2.0', // 用于缓存控制onFileProgress: (loaded, total) => {this.updateProgress(loaded, total);}};try {const bundle = await assetManager.loadBundle(bundleUrl, options);console.log('资源包预加载完成');} catch (err) {console.error('加载失败:', err);}
}
总结
动态资源加载系统通过assetManager
实现了:① 远程图片即时加载与异常处理 ② 场景资源按需分包加载 ③ 增量热更新维护。开发者应根据场景特点组合使用预加载与运行时加载,注意设置合理的缓存策略和错误处理机制。对于网络资源务必配置CORS或代理服务,AB包更新需配合版本清单管理,整体方案能有效降低首包体积,提升大型项目的运行效率。
📝 本阶段任务
- 实现角色换装功能:根据选择的服装动态加载不同贴图
- 制作启动加载界面:预加载首关卡所需资源并显示进度
- 扩展预加载案例:增加重试机制和超时处理(15秒未完成报错)
常见问题预解答:
- resources加载失败:检查路径是否以
resources/
开头,文件是否在正确目录 - AB包版本冲突:每次更新后需修改版本号强制客户端更新
- 内存泄漏:动态加载的资源需用
release
或autoRelease
管理生命周期