思考:如何提升游戏逻辑开发效率
提升游戏逻辑开发效率的关键在于:游戏新增或修改功能时,需要尽可能减少程序需要重复开发的代码量。
下面主要考虑以下三种减少编码工作量的方法:
<1>.尽可能将功能开发过程中核心逻辑(如收发协议,本地存储,距离检测等)封装成接口,可保证核心功能模块不因为团队人员水平差异在某些基础功能上出现异常或Bug。
<2>.逻辑重复,仅在内容上有所扩展的功能尽可能让策划可以使用配表/工具进行修改。
<3>.逻辑不重复,但逻辑关系可高度抽象或排列组合的功能,尽可能确定一套可修改逻辑关系的规则,在不修改解析代码的情况下实现这些不重复逻辑。
背景:客户端与服务器的角色逻辑
系统较为丰富的MMORPG游戏中,服务器分模块存储角色相关信息,实现某个新系统最容易想到的方法是在客户端登陆时/进入某个系统时主动向服务器请求相关信息。
但上述方法在游戏逐步添加新功能、属性、货币等时,无论功能逻辑是否发生较大改变,均需要开发人员在代码中新增请求协议并进行重新解析、存储、运算、显示,使用这一方法开发大型游戏会造成游戏逻辑开发效率低下,因此仍需要继续改进。
<1>常见封装核心逻辑方法:封装属性同步
- 属性一般包括如人物血量,攻击力,任务进度,副本完成情况等单个玩家信息。
1.服务器/客户端分别封装统一接口读取,修改和同步属性
2.数据可以自定义不同的数据结构,压缩/解压缩代码封装成统一接口供功能开发者调用
3.使用字典(键值对)方式存储服务器与客户端相同交集的数据
(相同交集:指需要交互的部分相同,如客户端页面表现等数据结构应该使用独立数据模块,不与需要网络交互的数据结构重合)
【优化】
使用上述属性同步的方法较为常见,但开发过程中仍需要开发人员手动添加新增某个属性的代码,在此基础上可再次进行优化。
【尽可能使用配置】
部分简单属性的客户端/服务器同步,可以采用读取统一配置的方式实现,例如已实现有货币交易逻辑(游戏内原有金币),此时游戏设计者需要添加相似逻辑的(银币),可通过配表类型进行分类,将同类型的同步属性用配置新增种类。
<2>重复逻辑效率开发方法:制作配表和工具
- 配表:业界常见方法,将游戏中单个模块重复信息(如道具信息,NPC信息,小怪基础信息等)抽象成配表供策划进行配置,这一方法基本在所有MMORPG团队中均有使用。
- 游戏功能逻辑修改工具:部分团队会设置专门制作游戏逻辑开发工具的岗位,也有一些团队由逻辑程序员制作相应工具。例如:特效配置工具,UI资源压缩工具,关卡剧情配置工具等。
<3>非重复逻辑效率开发目标:所有人都可写业务逻辑
游戏开发过程中大量的人员精力消耗在游戏业务逻辑的反复修改和改进中,这往往是最难解决的一环,大量的不重复逻辑会使不同团队成员之间的磨合成本增加,编程人员的大量时间不是花费在搭建框架和进行技术提升上,而是花费在理解大量不重复的业务逻辑上。
下面举例说明业界常见的方式:配表,可通过程序搭建业务逻辑配置框架对逻辑的增删改查进行管理,使得游戏设计者可通过修改配置的方式直接修改部分业务逻辑。
- 自由属性定义
- 自由属性赋值
- 自由条件控制
1.自由配置属性定义/赋值
例:配表中增加定义/赋值列,使用字符串类型生成赋值模块
- 初始化 模块名(属性 : 数值) player(gold : 0)
- 赋值 模块名(属性 = 数值) player(gold = 0)
- 增加 模块名(属性 : 数值) player(gold + 5)
- 减少 模块名(属性 - 数值) player(gold - 5)
- 判断 模块名(属性 >= 数值)player(gold >= 5)
模块名(属性 < 数值)player(gold < 5)
扩展:可排列组合使用
player(gold = 0, money = 0, hp < 5)
2.自由配置控制逻辑:属性变化
程序提供各种可用于配置的业务逻辑接口方法
案例:游戏中的人物血量控制
- 在某些特定条件下对血量进行修改
PlayerHPChange ( hp + 1000, SpecialSkill3 == true, Hp <= 9999, Damage > 1000, Speed > 50 )
SpecialSkill3 == true 当前玩家已习得特殊技能3
Hp <= 9999 当前玩家血量小于等于9999
Damage > 1000 当前玩家伤害值大于1000
Speed > 50 当前玩家速度大于50
【满足以上条件,则将玩家当前血量增加1000】
1.相似情况玩家其他属性变化均可按照相应接口格式进行变化 同类逻辑程序不再需要进行重复二次开发
2.策划可直接通过配表修改相应的属性变化逻辑
3.策划直接将此字符串配入配表相应字段,在客户端/服务器更新配表后即可运行相应模块进行本地测试
3.自由配置控制逻辑:行为状态变化
案例:游戏中的任务系统配置
- 在某些特定条件下完成特殊任务
FinishTask (Id : 66, TalkNPCId >= 88, HaveItemCount(55, 1000) )
TalkNPCId >= 88 玩家对话NPCId大于88
HaveItemCount(Id == 55, Count >= 1000) Id为55的道具数量 >= 1000
【满足以上条件,则将玩家Id为66的任务设置为完成状态】
- 负责任务系统的程序可通过代码增加兼容的判断条件
- 策划可直接通过配表排列组合这些判断条件以完成特定业务逻辑
- 当策划需要修改单个特殊任务完成的条件或界面表现时,可以自行调整配表并运行测试,不需要程序修改原有业务逻辑代码,减少工作中的强耦合
扩展
案例:游戏任务系统中,任务执行过程中会触发另一任务
设定如下:
- 任务A在某情况下已达成并开启任务B,C
- 任务B独立进行条件检测及监听
- 任务C完成后需要对任务A进行反馈
以上需求在上述任务系统的配置中暂时无法实现。
【方法A:使用任务组的方式进行逻辑管理】
将A,B,C作为一组任务进行配置,在配表中特定字段进行关联
【方法B:将多任务触发机制封装成为接口进行配置】
抽象出任务之间相互关联的形式并封装成接口
策划可在配表中排列组合这些接口处理多任务间的关联
代码生成器
通过制作工具:代码生成器,将上述角色配置生成自定义属性代码,程序将自由属性定义/赋值的字符串解析方式定义完整后,制作生成相应业务逻辑代码的代码生成器。
使用解释型语言(如Python,Lua等)进行一些可变性强的逻辑开发
例如控制过场动画特效/音效播放时间点,NPC根据剧情设定移动路线,均可在实现接口后用解释型语言进行具体逻辑开发,游戏设计者可直接通过调用这些已实现接口编写相应的解释型语言,仅修改代码中包含的位置信息,时间点信息进行游戏业务逻辑的修改。
制作美术工具
举例如下:
1.制作对游戏中UI字色,模型比例等进行统一管理的工具
2.制作修改UI风格的相关工具,如使用工具对整体UI颜色色相,饱和度进行修改,不需要美术人员使用PS逐个修改图片文件。
3.制作一些自动生成工具,如场景自动化随机生成
4.制作可视化编辑工具,如美术或策划人员可在引擎内自由查看某个动画循环播放的效果,模型动画在某时间点添加特效的最终效果。
大型功能初次开发时尽可能考虑兼容性
大部分工作情况下,大型功能在游戏开发过程中是逐个增加的,而不是同类型地成批增加。因此需要开发某大型功能的程序在开发初期更多地考虑后续扩展的兼容性。
例如,当前需求是一个大型副本,需要分属两个服务器的人进入游戏并进行战斗并获取奖励。
此时程序需要考虑下面几种情况:
1.副本内数值策划是否会对不同服玩家进行部分数值平衡,是否能通过配置修改相应参数并动态根据玩家数量,战力等计算进行数值平衡。
2.后续是否会出现三个甚至更多数量的服务器玩家进入同一副本进行跨服活动的需求,当前实现的逻辑能否覆盖这些情况
3.奖励发放时间点及发放方式变化
4.界面效果是否存在可复用的逻辑,需要抽象成接口方便调用。
5.副本进入的新场景是否在美术资源方面是否有可复用的部分。
6.副本的开启,进入,离开,副本开启前的提示是否可形成通用配置。
7.副本中屏蔽玩家部分操作的部分代码是否可复用。
更进一步提升游戏开发效率:为下一个项目做准备
有中型或大型公司游戏开发经验的朋友都知道,大部分情况下同一公司或部门倾向于制作同一类型的多款游戏,这时候上一个项目的开发能够为下一个项目的开发打好基础就尤为重要。
下面列举一些可复用的模块和技术:
1.资源管理工具(音效,美术,动画资源管理)
2.图形渲染相关技术
3.配置导出或生成代码工具
4.同类游戏的核心逻辑(如RPG游戏中战斗,寻路,NPC对话等)
5.形成规范的配表规则(可沿用同方式进行配置,减少团队成员磨合成本)
6.一些游戏中常见的活动逻辑代码可复用核心逻辑代码(如每日登陆奖励,转盘抽奖,节日活动等等)
7.游戏逻辑编辑工具(上文详述)
8.部分核心模块架构(如UI层级管理,角色视野管理,任务进度管理等)