【游戏开发】MOBA手游客户端架构设计<二>
UI系统实现
1、GameUserWindow(角色选择窗口)、LoginWindow(登录窗口)、ScoreWindow(分数展示窗口)、RoomWindow(房间窗口)是四个窗口示例,其他窗口的实现与这四个类似,下图中省略不画出。
除了实现接口中定义的方法以外,这些类中还会包含它们自身的UI控件和UI逻辑方法,此外,部分用户交互相关的游戏逻辑也会被写在这些类中。
2、WindowManager负责对窗口的管理:
mWindowDic是窗口字典,Key是窗口类型,Value是窗口实例对象,ShowWindowOfType是从字典中找到某类型的窗口并打开,HideAllWindows会将字典中保存的窗口实例都关闭,一般是在游戏暂停或退出前调用的。
3、BaseWindow 作为所有窗口基类,包含所有窗口基础操作方法:
类名 | 类说明 |
---|---|
Init | 类对象初始化 |
Realse | 类对象释放 |
InitWidget | 窗口控制初始化 |
RealseWidget | 窗口控件释放 |
OnAddListener | 游戏事件注册 |
OnRemoveListener | 游戏事件注销 |
OnEnable | 界面显示初始化 |
OnDisable | 界面隐藏处理 |
Update | 每帧更新 |
GetScenseType | 取得场景类型 |
Show | 界面展示 |
Hide | 界面隐藏 |
PreLoad | 界面预加载 |
DelayDestory | 界面延时删除 |
资源管理系统实现
资源分为逻辑资源和物理资源。逻辑资源是逻辑操作需要的接口,比如场景,角色等;物理资源是物理资源的组成,游戏资源的管理逻辑主要集中在逻辑层面,物理资源通过机制管理,逻辑资源引用物理资源,引用哪些资源在逻辑资源的prefab中存储索引。
资源控制器(ResourceManager),确定资源的导入方式,资源的整合管理。其主要功能如下:
1、建立资源池,将同类资源一起加载,相似资源合并或互相替代,循环重复使用已加载入内存中的游戏资源,能够大大降低游戏程序在内存中加载游戏资源的时间复杂度,同时将同一类资源对内存的使用控制在开发者限定的范围内。
2、将游戏包体中的游戏资源在特定时机解码并异步载入游戏,加速资源加载,减少玩家肉眼可识别的游戏画面卡顿或掉帧现象。
3、统一释放内存可以有效预防,监控及减少内存泄漏问题。
4、游戏资源用游戏中指定ID进行管理,游戏开发过程中替换资源时能够及时发现命名、路径或格式等错误,让开发者能够清晰地分辨资源错误与游戏逻辑错误,方便对系统进行修改及测试。
5、游戏需要进行平台移植时,仅需要修改资源加载模块,即可控制在不同平台下进行资源压缩优化和加载,而不用去修改核心游戏逻辑,可以大大减少为平台移植付出的时间和效率成本。
文件名 | 文件说明 |
---|---|
EnviromentSetting.cs | 场景设定(包括环境光和雾效等) |
LightmapHelper.cs | 光照贴图设定 |
LoadImplement.cs | 网络载入资源接口 |
LoadProcess.cs | 加载过程,用于控制loading过程 |
LogicResource.cs | 登录时预加载资源 |
LogicResourceBuilder.cs | 登录时预加载资源 |
PhyResource.cs | 物理资源管理 |
定义游戏的资源导入路径,环境设置及导入格式或参数定义等。游戏中所用到的场景、角色人物、怪物、道具、特效、用户界面等的模型和贴图统一称之为资源。
流程控制系统实现
IEntity是游戏中统一的实体类接口,其包含的属性及方法用于实体类的管理和操作。
EntityFSM是FSM实体类的抽象接口,包含Enter(进入状态),StateChange(状态转换),Execute(执行状态),Exit(退出状态)四个FSM基础操作方法,能够涵盖状态转换中所需的基本逻辑。此外,EntityFSM还包含CannotStateChange(是否允许状态转换的标志位)和State(状态实体类)这两个变量,FSM实体与State实体一一对应,State主要涵盖该状态的各项属性和状态中操作,而FSM则主要包含状态转换相应的逻辑。
PlayerAdMoveFSM(角色移动FSM)和EntityDeadFSM(角色死亡FSM)是两个FSM实体示例,除这两个类以外还有其他多个游戏中FSM类,下图中省略并未画出。FSM实体主要是实现上述接口。
IGameState是游戏状态实体的接口,主要包含GetStateType(获取状态类型),SetStateTo(设置状态类型),Exit(退出状态)这三个方法。
LoginState(登录状态)、LobbyState(游戏大厅状态)、PlayState(游戏中状态)、LoadingState(载入状态)、HeroState(角色选择状态)是五个状态类示例,除此之外还有其他状态类,下图中省略未画出。状态类除了实现IGameState中的五个基础方法以外,还要实现当前状态的其他特殊方法以完成游戏逻辑。其包含的变量主要包括状态类型、场景根节点、UI根节点(场景和UI在游戏编程中均以树状结构展现,因此要保存根节点以便操作)。
游戏状态管理器用于管理所有游戏状态,包含一个状态字典,Key是状态类型,Value是IGameState状态接口(这一做法可以将所有状态实例抽象成统一类型保存入字典中),GetCurState方法获取状态实例,EnterDefaultState方法进入默认状态(并开始状态转换),Update(对当前状态做每帧状态更新)。
数据交互系统实现
一、ConfigReader.cs及数据读取类
将游戏重要数据定义与游戏逻辑和其他游戏数据分离开来,当游戏需要进行新的平台机型适配或特殊修改时,只需要修改这一个类,而不用对游戏整体进行修改。当然,这也需要开发者在系统最初开发时就预先思考并有意识地将重要变量编写到同一个类中进行管理。系统每次需要调用这些重要数据时程序开发者都要有意识地从GameDefine中读取数据,这会在后期修改发布时节约很多时间。
根据指定文件路径,解析Xml或二进制文件,得到C#的Config数据类脚本,访问并解析客户端包体内的游戏数据,游戏脚本中其他逻辑脚本均通过数据管理类访问底层数据,并将读入内存的数据存储在GameData的数据实体类中,可以有效地将数据访问的逻辑和游戏规则与操作逻辑区分开来。ConfigReader引用对这些数据读取类的字典进行统一管理.
二、GameData:
游戏中数据类,作为游戏客户端数据层:
文件名 | 功能说明 |
---|---|
AltarData.cs | 基地数据 |
BattleingData.cs | 战斗数据 |
DailyBonusData.cs | 日常奖励数据 |
GameTimeData.cs | 游戏时间数据 |
LoadBaseDate.cs | 加载基础配置数据 |
PackageData.cs | 资源打包数据 |
PlayerBattleData.cs | 玩家当局数据 |
PlayerPersonData.cs | 玩家个人数据 |
PlayerSkillData.cs | 角色技能数据 |
SelectServerData.cs | 服务器选择数据 |
SystemNoticeData.cs | 提示系统数据 |
1、提供游戏中各类游戏对象实体类接口:如角色、NPC、防御塔等。
以下类均继承自IEntity.cs基类:
类名 | 功能说明 |
---|---|
INpc | NPC实体类 |
Tower | 防御塔实体类 |
Iplayer | 其他玩家实体类 |
Iselfplayer | 本机玩家实体类 |
2、提供游戏中各类特殊关系实体管理类:如好友、阵营等。
对游戏中特殊关系建立实体是为了在游戏中持续管理该种关系,换言之,这种特殊关系的存在会对游戏玩家的行为结果产生持续性影响。
类名 | 功能说明 |
---|---|
CampType | 阵营管理 |
FriendManager | 好友管理 |
GameBuildings | 游戏中建筑管理 |
InviteOtherPlayer | 玩家邀请管理 |
NpcManager | NPC管理 |
PlayerManager | 所有玩家(角色)管理 |
EntityStrategyHelper | 策略管理 |