随着游戏开发的完整度提升,技能系统的设计复杂性也越来越高,导致了用模板方式的配置方法和处理方法会导致以下几个问题:

  1. 代码冗余
  2. 排错困难
  3. 配置项冗余
  4. 熟悉业务流程时间长
  5. 扩展性低

经过我思考决定重写之。分析以下几个观点,由于早期设计上的局限,和实际开发预期的不符,技能系统也必然会成为策划脑洞大开的一个点,并且也会成为MOBA游戏体验的深度核心项之一。于是一个成熟的MOBA技能系统应该包含一下几点:

  1. 代码流程清晰
  2. 错误定位精确
  3. 配置项定位精确
  4. 熟悉业务流程时间短
  5. 扩展性强

  应该还有一些我没有想到或者没有记录到的点,在此就说明以上几个。

 有一些程序在设计一些高扩展性同时又是核心要素的系统时,不出意外的也会遇到以上的几个问题。

  这里的核心关键就是:

  在设计之初对未来的需求是未知且不可预测的。

  那么我是怎么解决以上的几个问题的呢?

  因为我一直在使用 Unity 做前端开发。深知Unity的ECS (实体组件系统) 架构体系带来的便利。

  于是我打算根据ECS的架构方式的模子去设计,但不完全根据ECS的架构来,保持对具体项目需求的贴切。

  于是我设计了如下三个层:

  1. 流程控制层
  2. 原子函数层(技能)
  3. 逻辑层(技能)

  有时候我认为这个设计很像行为树。好吧确实有点像,但又不是那么像。这里不深究,留疑。核心还是留在解决需求上。

  流程控制层具备以下几个组件:

  1. CtrlBase -> 作为所有流程控制的基类
  2. CtrlBreak -> 用于中断所有流程控制组件
  3. CtrlCondition -> 用于流程控制中的分支操作
  4. CtrlDelayTime -> 用于流程控制中的延时执行操作
  5. CtrlDuration -> 用于在一段时间内执行一段动作
  6. CtrlSequence -> 用于序列执行一组动作
  7. CtrlTimeLine 组件 -> 用于创建一个时间轴,让所有流程组件在这个时间轴上执行

  原子函数层(技能)具备以下几个组件:

  1. SkillCondition -> 提供技能条件的判定
  2. SkillEntity -> 提供技能实体的操作
  3. SkillFightObjMap -> 提供战斗对象查询获取等操作
  4. SkillInOutValueToPlayer -> 提供对战斗对象角色的数值输入输出
  5. SkillPlayuerCtrl -> 提供对角色的控制操作
  6. SkillTarget -> 提供技能对象的具体信息

  逻辑层(技能):

  1. SkillBase -> 所有逻辑层的基类 定义所有的技能逻辑层数据
  2. Hero1/skill_1 -> 英雄1的技能1逻辑对象
  3. Hero2/skill_2 -> 英雄2的技能2逻辑对象
  4. ...类推

  从以上的结构中可以直接看出目前的冗余层在逻辑层,而逻辑层的支撑在控制层和原子函数层,随着开发深度的越来越高,控制层和原子函数层的操作组件会越来越多或功能性越来越强。则为逻辑层提供的操作/组合方式更为丰富,则可实现的动作会更为强大。

  并且从排错来说只要控制层和原子层确保无误(实际也必须无误),基本错误定位能直接找到对应技能的逻辑层,且逻辑层没有多余代码,每一句都和技能的具体逻辑有所关联,线性排错。难度低。如若错误出在原子或控制层则是一批技能同时出现问题,也好定位。

  所以这里已经做到代码流程清晰,错误定位精确。

  同时因为每个技能有独立逻辑层则配置的定义也可以独立,这里也做到了配置项定位精确。

  基于以上几点精确定位的特性导致熟悉业务的时间就因此变短了。

  又因为原子函数层/控制层的支持性可扩展,具体技能的业务逻辑可定制,所以扩展性强了。

  给予这种设计模式,带来的好处可见是非常大的,但是同时也导致了必须要让程序长期来维护或定制具体的技能模块。所以我一直认为策划是可以具备一些脚本功底的,只要我们保证原子函数层和控制层提供的是安全接口。则可以对策划放开脚本编写,甚至可以用弱类型解析类脚本语言来提供具体的技能逻辑定制。

  还有一种方案是开发一款能够生成逻辑层的流程编辑器,将原子函数层和控制层反射导入。生成逻辑层代码。不过这个成本太高而且规则不好定制。有可能还没程序直接编程性价比更高。所以我没有选择开发流程编辑器的方式。

  这个架构在我实际运用中,感觉还是非常好的,因为大多的技能其实相似性还是蛮高的,如果技能难度不高,原子函数不需要迭代添加,则进行逻辑组合的时候实际效率很高。我刚刚开发完这套系统,重构现有的技能(10个左右)也就花了3个小时左右吧。相比之下模板类的效率我认为要高的多,而且对开发者的友好度更高。

  所有的设计都应该建立在更贴切实际开发需求上,我认为所有的系统设计都应该建立在需求的不可预知和灵活性扩展上,同时也需要衡量它的性价比,不做过度设计,不墨守成规。

MOBA 游戏技能系统设计 2.0的更多相关文章

  1. ARPG游戏技能系统设计

    ARPG游戏的技能的前端表现, 主要指的是人物动作和特效表现, 从普遍意义上讲,大致可以分为三个阶段:起手.飞行.碰撞(爆炸). [特效可见性判断] 1.[attacker & victim] ...

  2. 在moba游戏里面模拟实现绝地求生毒雾圈功能

    ---恢复内容开始--- 已经有很长一段时间没做项目了上半年大多数时间都荒废在王者荣耀,哈哈,S8赛季也上了王者,美滋滋 转回正题,公司需要开个新项目,需要把原有的moba游戏,改成类似绝地求生那玩法 ...

  3. MOBA游戏学会这些知识,你才算真的入门了!

    <英魂之刃口袋版>是一个标准的MOBA游戏,MOBA指的是多人在线战术竞技游戏,游戏模式始于1998年<星际争霸>中的一张自定义地图,经过近20年的优化和调整逐渐演变成了我们现 ...

  4. 王亮:游戏AI探索之旅——从alphago到moba游戏

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由云加社区技术沙龙 发表于云+社区专栏 演讲嘉宾:王亮,腾讯AI高级研究员.2013年加入腾讯,从事大数据预测以及游戏AI研发工作.目前 ...

  5. 知道创宇研发技能表v3.0

    知道创宇研发技能表v3.0 2015/8/21 发布 by @知道创宇(www.knownsec.com) @余弦 & 404团队 后续动态请关注微信公众号:Lazy-Thought 说明 关 ...

  6. Unite 2017 | 从《闹闹天宫》看MOBA游戏里的网络同步技术

    http://mp.weixin.qq.com/s/0v0EU79Q6rFafrh8ptlmhw 在Unite 2017 Shanghai案例分享专场,来自蓝港互动<闹闹天宫>项目组的主程 ...

  7. MOBA游戏的网络同步技术

    转自:http://www.gameres.com/750888.html 在5月13日Unite 2017 案例分享专场上,蓝港互动<闹闹天宫>项目组的主程序陈实分享了MOBA游戏的网络 ...

  8. Scut游戏服务器引擎6.0.5.0发布-支持C#脚本

    1. 增加C#脚本支持2. 增加Pay和Sns中间件对Mysql数据库支持3. 精简布署步骤,取消Redis写入程序,将其移到游戏底层运行4. 修正Mysql对中文可能会出现乱码的BUG 点击下载:S ...

  9. AI-Info-Micron-Insight:将您的游戏技能变成一份工作

    ylbtech-AI-Info-Micron-Insight:将您的游戏技能变成一份工作 1.返回顶部 1. 将您的游戏技能变成一份工作 听起来不现实? 一位来自著名商学院的教授不这么认为.他认为,金 ...

随机推荐

  1. [Codeforces 696D] Legen...

    题目大意: 给出一些匹配串,要造一个长度不超过L的字符串,每个匹配串有自己的价值,匹配串每次出现在字符串里都会贡献一次价值...要求可能得到的最大价值. 匹配串总长不超200,L<=10^14, ...

  2. NowCoderWannafly挑战赛3-B.遇见

    遇见 时间限制:C/C++ 1秒,其他语言2秒空间限制:C/C++ 65536K,其他语言131072K64bit IO Format: %lld 题目描述 A和B在同一条路上,他们之间的距离为 k ...

  3. I Hate It(线段树点修改区间查询)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1754 I Hate It Time Limit: 9000/3000 MS (Java/Others) ...

  4. 无序列表li横向排列的间隙问题

    今天在写页面的时候,无意中遇到这样一个问题,就是无序列表li横向排列即做成导航栏时,列表项间有间隙. 如: 将列表项li变成列表块后(即将li标签设置为,display:inline-block后), ...

  5. Tomcat服务器的下载及安装

    Tomcat服务器的下载及安装 1)到apache官网.www.apache.org     http://jakarta.apache.org(产品的主页) 2) 安装版:window (exe.m ...

  6. APACHE 服务器开启URL REWRITE模块的方法

    最近做wordpress,发现固定链接总是设置不了.后来发现是由于apache服务器的URL REWIRITE模块没有开启导致. 查询了资料之后终于设置成功,记录下步骤: 1:开启apache的url ...

  7. Java数据持久层框架 MyBatis之API学习九(SQL语句构建器详解)

    对于MyBatis的学习而言,最好去MyBatis的官方文档:http://www.mybatis.org/mybatis-3/zh/index.html 对于语言的学习而言,马上上手去编程,多多练习 ...

  8. java学习总结之文件操作--ByteArrayOutputStream的用法

    ByteArrayOutputStream类是在创建它的实例时,程序内部创建一个byte型别数组的缓冲区, 然后利用ByteArrayOutputStream和ByteArrayInputStream ...

  9. servlet入门学习之API

    java servlet API学习网址: http://tomcat.apache.org/tomcat-7.0-doc/servletapi/ http://tomcat.apache.org/t ...

  10. [知了堂学习笔记]_记一次BootStrap的使用

    效果图如下: 一.简介: 什么是Bootstrap?  Bootstrap 是一个用于快速开发 Web 应用程序和网站的前端框架. 什么是响应式布局? 引用一句Bootstrap的标题语 " ...