本文主要是介绍开源一个高度可扩展的技能与多层Buff叠加的双端框架,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
在设计项目的技能系统与多层Buff的时候,你可能会遇到如下问题:
多种技能与Buff的计算,各种if else判断揉在一起,无法扩展更多类型,
角色同时有多种不同Buff要对同一属性做加成时,如何设计?
同一类技能,可能某个个别技能要比其它技能多一个操作, 如何设计?
同一类Buff,需要处理多个不同的属性的叠加与消耗, 如何设计?
多技能与多Buff的冷却处理,要支持添加任意类型,如何设计?
如何与策划沟通,是否要做技能编辑器,如何抉择?
… …
对惹,这里有一个游戏开发交流小组,希望大家可以点击进来一起交流一下开发经验呀!
我们开源一套高度可扩展的技能与多层Buff叠加的双端架构(支持Unity,Cocos双客户端), 除了C#的Attribute与TypeScript的装饰器在使用上的差别,导致每类Model的写法有些差异以外,其它我们基本保持一致。
这套框架的主要特点是:
1: 机制,数据,计算规则完全分离。机制提供核心的服务,数据由配置表来驱动,规则模块会被自动识别并关联好。
2: 可以任意添加扩展各种技能类型与各种Buff类型。
3: 技能与Buff支持默认处理规则逻辑外,还支持特定技能Buff的特定规则扩展,满足个别变态需求。
3: 每类技能与Buff的配置表可以完全独立,分开维护,每类数据的参数功能明确;
开源代码:
Unity:
链接:https://pan.baidu.com/s/1G7gUr7F981MBe7rrkRdlUg?pwd=1gyk
提取码:1gyk
Cocos Creator 3.8:
链接:https://pan.baidu.com/s/1t5A7vFqG7Lrne60fmS7z2w?pwd=5ava
提取码:5ava
同时我们也配套了相关的讲解课程:
Unity 技能与多层Buff架构与设计:
精选推荐:如何高度可扩展的技能与多Buff框架
Cocos Creator 3.8 技能多层Buff的架构与设计:
精选推荐:如何打造高度可扩展的技能与多Buff框架
点击”阅读全文”,可以在免费公开课中找到我们的课程讲解。
// step2: 获取公式参数后,带入到buff公式,计算buff加层后的值
// step3: 返回计算出来加成后的值
Return 最后计算出来的buff加层的值
}
目前常用的buff,比如加速鞋等,可以采用这样的方式来处理。
步骤2: 将具体的计算独立于流程外,基于buff ID动态选择计算函数。
为了新加入的buff规则能快速方便的接入到我们的游戏逻辑中,不用改动流程逻辑代码 ,我们可以将具体的计算独立于流程体系之外,根据buffID来动态选择对应的计算buff加成算法。游戏buff计算的逻辑流程中,使用统一的接口CalcBuff来给逻辑流程计算buff,我们编写函数CalcBuff,函数实现中通过buffID来找对应的具体计算函数并调用。对于逻辑流程而言,直接调用CalcBuff即可,而具体的计算规则由每个规则函数自己独立编写,我们只要BuffID找出规则计算函数对象,调用即可。伪代码如下:
int CalcBuff(int skillID, int buffID, Entity entity, …) {
// step1: 根据skillID, buffID,找到对应的计算函数;
var func = SkillBuffCalcMgr.GetSkillBuffCalcFunc(buffID);
// step2: 根据找到的函数对象,来调用具体的计算规则函数
return func(skillID, buffID, entity, …);
}
游戏buff逻辑流程代码中,调用CalcBuff来获取buff的计算结果,具体的计算规则,我们可以将代码编写到独立的模块里面实,新建一个SkillBuffCalcMgr类,Init时,根据Attribute注解扫描所有的buff计算函数,根据ID做好映射。编写接口GetSkillBuffCalcFunc函数,根据buffID来返回它对应的计算函数。每个具体的计算函数,带一个SkillBuffRule注解,让系统扫描的时候识别到它,加入映射表。
Class SkillBuffCalcMgr {
private static Map buffFuncMap;
public static void Init() {
Type t = typeof(SkillBuffCalcMgr);
// 利用反射,遍历所有的静态方法,找出带有SkillBuffRule注解的函数
var func = xxxxxx;
AddFunc2Map(skillID, buffID, func);
}
public static GetSkillBuffCalcFunc(int skillID, int buffID) {
return GetFuncFromMap(skillID, buffID);
}
[SkillBuffRule(20001)]
Public static int CaclSkillBuffRule_20001(int skillID, int buffID, Entity entity, …) {
…
}
[SkillBuffRule(20002)]
Public static int CaclSkillBuffRule_20002(int skillID, int buffID, Entity entity, …) {
…
}
[SkillBuffRule(20003)]
Public static int CaclSkillBuffRule_20003(int skillID, int buffID, Entity entity, …) {
…
}
}
当我们要增加一个BuffID对应的计算规则的时候,只需要加一个注解+函数,例如增加一个ID为20004的buff,只要编写一个计算函数即可,如下:
[SkillBuffRule(20004)]
Public static int CaclSkillBuffRule_20003(int skillID, int buffID, Entity entity, …) {
…
}
这样系统就能自动识别到20004, 就能在游戏逻辑里面使用20004的buff计算了。
今天的分享就到这里了,我们近期推出了单次咨询服务,包括:游戏创业咨询,项目技术架构咨询等,点击”阅读全文”查看。
这篇关于开源一个高度可扩展的技能与多层Buff叠加的双端框架的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!