Cocos Creator大厅+子游戏模式热更新(同一个项目下)

在网上查找了很多的大厅子游戏热更新模式方案,但是基本都是分成两个项目,这样的开发非常不好处理,不像以前的lua开发,可以同时在一个项目里进行开发,采用分项目的模式会造成子游戏与大厅的代码不好切割,比如大厅已经包含了一部分的公共代码,而子游戏里也会用到,这时,每开发一个新游戏就不能使用了,还得在自己提取一些公共的代码,每个人的做法都有自己的一套,这就造成了代码的混乱与不好管理,所以自己尝试了在同一个项目是否可以进行大厅子游戏模式的热更,在此提供自己的一些主要思路

1:把子游戏作分包处理,构建后会在subpackags目录下有对应子包的文件,用子包模式主要是所需要用到的子游戏的代码和raw-assets里面的资源都归到一个游戏当中管理,当子游戏需要更新时,不会影响到大厅

2:把构建生成的settings.js文件,分成多个settings.js文件,一个是大厅的settings.js,其他的settings.js文件为每个子游戏对应的settings.js文件,主要是分割字段rawAssets对应的assets的uuid,通过你切分的子包路径进行筛选是否归于子游戏的settings.js里

3:有了子游戏的raw-assets和源代码之后,还需要import目录,这时候我们通过读取我们工程子游戏里的全部meta文件,可以查看到对应的文件uuid,然后再读取对应的uuid文件里面的内容,需要用到的uuid,依此循环,把需要用到的全部uuid.json文件移动到子游戏的import目录,需要注意的是import文件上一层还需要建立一个res文件目录,res与raw-assets同级,这主要是因为游戏里根据相对路径查找uuid的,如 res/import 这样的方式查找,所以热更的时候下载的目录得适配此原则

4:main.js文件的编写,第一个是设置文件查找路径,包括添加热更的主目录与子游戏的目录,另一个是合并大厅的settings.js和每个子游戏的settings.js文件里面的内容,主要是相关uuid的合并,作为game.run启动所需要用到的参数,首场景设置成一个黑底场景,此场景主要是根据一个变量来判断是否转换到登录场景或者是子游戏的第一个场景里,这主要是因为我们每次热更都得重新加载一遍main.js文件,从而使游戏重启后能够切换到我们所需要的场景里

5:根据每个游戏的目录生成热更新manifest配置文件

 

参考资料:

1:大厅工程和子工程uuid合并 main.js编写 https://www.cnblogs.com/zhong-dev/p/10782834.html

2:https://www.cnblogs.com/ybgame/p/10837078.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个使用 Cocos Creator 3.7 和 TypeScript 实现的简单涂鸦跳跃游戏的代码示例: ```typescript const { ccclass, property } = cc._decorator; @ccclass export default class DoodleJump extends cc.Component { @property(cc.Node) player: cc.Node = null; @property(cc.Node) platformPrefab: cc.Node = null; @property(cc.Integer) jumpHeight: number = 300; @property(cc.Integer) jumpDuration: number = 0.5; @property(cc.Integer) maxJumpCount: number = 2; // 最大跳跃次数 private jumpCount: number = 0; // 当前跳跃次数 onLoad() { cc.systemEvent.on(cc.SystemEvent.EventType.KEY_DOWN, this.onKeyDown, this); cc.director.getCollisionManager().enabled = true; } onDestroy() { cc.systemEvent.off(cc.SystemEvent.EventType.KEY_DOWN, this.onKeyDown, this); } onKeyDown(event: cc.Event.EventKeyboard) { if (event.keyCode === cc.macro.KEY.space) { this.jump(); } } jump() { if (this.jumpCount < this.maxJumpCount) { this.jumpCount++; const jumpAction = cc.jumpBy(this.jumpDuration, cc.v2(0, 0), this.jumpHeight, 1); const callback = cc.callFunc(() => { this.jumpCount--; }); const sequence = cc.sequence(jumpAction, callback); this.player.runAction(sequence); } } spawnPlatform() { // 在场景中生成平台节点 const platformNode = cc.instantiate(this.platformPrefab); // 设置平台的位置 // ... // 添加平台节点到场景中 this.node.addChild(platformNode); } // 碰撞回调 onCollisionEnter(other: cc.Collider, self: cc.Collider) { if (other.node.group === 'platform') { const platform = other.node.getComponent(Platform); if (platform) { platform.bounce(); } } } } ``` 在上述代码示例中,我们使用 TypeScript 编写了一个名为 `DoodleJump` 的组件,它是涂鸦跳跃游戏的主要逻辑控制器。该组件包括了玩家角色、平台预制资源以及一些相关的属性和方法。 在 `jump()` 方法中,我们使用 `cc.jumpBy` 创建一个跳跃动作,并通过回调函数来处理跳跃次数的计数。按下空格键时,会调用 `jump()` 方法触发角色跳跃。 在 `spawnPlatform()` 方法中,你可以根据自己的需求生成平台节点,并设置其位置信息。 在 `onCollisionEnter()` 碰撞回调中,我们检测与平台的碰撞,并调用平台组件的 `bounce()` 方法来实现弹起效果。 请注意,以上代码示例仅为参考,具体的实现方式可能会因你的游戏逻辑和组件设置而有所不同。你可以根据自己的需求和项目结构进行相应的调整和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值