在前阵子举办的 Cocos 开发者沙龙上,来自华夏乐游 BigRoad 工作室的客户端主程李清,为现场开发者分享了其团队制作的实时竞技小游戏《保卫豆豆-欢乐枪战》的技术实现方案,深受开发者喜爱。在征得华夏乐游的同意后,技术派专栏将通过本文对李清的演讲进行梳理总结,把他们宝贵的技术经验分享给因为各种原因没能去到沙龙现场的开发者伙伴们!
李清
关于华夏乐游
北京华夏乐游科技股份有限公司是一家专注于游戏研发与发行、泛娱乐IP打造和经营的创意文化企业。代表作品《奔跑吧-撕名牌大战》3、4、5系列,《极速前进-狂野飞车》、《星河战神》。目前聚焦于以 H5 为代表的无端和轻端游戏,先后研发和发行了《欢乐消消消》、《保卫豆豆-欢乐枪战》、《全民小镇》等微信小游戏,同时多款游戏上线微信小游戏精品平台。
游戏简介
**《保卫豆豆-欢乐枪战》**是一款基于 Cocos 引擎研发的休闲射击乱斗小游戏,融合了射击、MOBA、吃鸡等热门玩法。
游戏特点:
萌宠射击,实时竞技
四人乱斗,双人组队
多个英雄,身怀绝技
本文主要从三个方面来进行分享,分别是:
- ECS 架构
- 网络同步机制
- 技术难点及解决方案
一、ECS架构
1、ECS 架构目的:
降低不断增长的代码库的复杂度。
2、游戏原型需求:
子弹:移动、碰撞
英雄:移动、碰撞、发射子弹
炮台:发射子弹
3、传统架构的弊端
要实现游戏原型,按照我们之前的做法,是用一个类来实现一种游戏实体的所有功能,这个类既有状态,又有行为。代码复用使用继承来解决。如果用这种做法,那么类大概长这个样子:
类图
大家可以看到,父类会有很多共享的属性和方法,子类继承父类去做具体的事情。但是这种做法有很多弊端,比如说,随着项目规模的增长,代码库复杂度也不断增长,父类会越来越复杂,子类的功能越来越不明确,与多个类相关的代码你不能太确切知道应该放在哪里,拓展功能的时候极其不灵活,如果后期需要增加新功能的话,我们需要对整个继承树进行功能重构才能使其比较合理。
在经历过几个项目之后,**我们回头反思,发现之前的做法,违反了很多面向对象设计原则。**比如说:
- 单一责任原则(Single responsibility principle)
每个类都应该只有单一的功能,并且该功能应该由这个类完全封装起来。
- 组合重用原则(Composite Reuse Principle)
默认情况下应当使用组合,只有在必须时才使用继承。
在总结了从前的项目经验,并参考了大量技术文章后,我们找到了一种架构,把大量的模块进行拆分解耦,然后再集成起来,这就是我们接下来要介绍的 ECS 架构。
4、ECS架构
ECS 分别是:
- Entity(实体)
- Component(组件)
- System(系统)
看到实体和组件大家可能觉得比较熟悉,但是这里要注意,这跟我们引擎中的实体组件框架可不是一回事,接下来我为大家简单介绍一下 ECS 架构的元素。
(1)ECS 架构元素:
Component:组件,存储游戏状态
Entity:实体,组件的集合
Systemÿ