我们在尝试触摸美好的幻想。

by 猫刀刀

我小时候以为盘腿闭目沉思,就能感知到气,进而修练成绝世高手!

理想很丰满现实很骨感是吧

相信在同一片天空下的人们,或多或少也有着同样的骨感吧

所以

我们创作

剑仙,超级赛亚人,悟空,灭霸......这些在幻想中的人物承载着我们的憧憬

如今

我们有着较强的计算能力,和好的显示媒介

我们已经把各种存在于幻想中的能力搬进了游戏,且一直思考如何做的更好

技能系统

啥是技能系统狭义论

技能系统在我看来是一个非常非常宽泛的词,我写这篇博客的目的是为了尝试从一个游戏技术开发的角度去拆解技能系统,例如在实际开发中,会将技能系统抽象出哪几个部分。所以,这并不能展示技能系统的全貌。

moba、act类游戏技能系统数据拆解

Hit(触发检测)

Hit是技能里最基本的元素之一,在大体分类上有3D和2D检测,制作触发检测的方法多种多样,直接通过坐标运算或者依赖于已有的物理引擎等,不管怎样我们需要能构建自己的触发规则和获取到触发的数据。

hit重要的实现需求

hit原子化设计,一个hit就是一个hit,每个hit有每个hit的属性。

检测范围形状的多样性。

支持检测时间的可调,是一瞬间,还是一段时间。

触发范围的动态可调。

触发双方对象数据的获取

状态

任何实体任何时刻只会处在一个状态中。

引入一个极限的概念,一个抬手动作的完成过程,在这个完成区间内可以细化出无数个状态。

可以根据游戏的实际需求,去调节状态的原子化的程度。

在本人的狭义论中,永远是先进入抬手状态,再有抬手动作,也就是说动画只受状态的驱动。

状态重要的实现需求

要实现状态与状态之间的解耦。

每个状态要可方便的进行单独维护。

状态执行缓存栈的实现。

--例如一个可延续的状态被一个状态打断,打断结束后要继续之前的状态执行。

状态栈对于游戏的重要性云分析

本人还没完整的动手操作所以加个云字

其实这是本人对状态管理的一个设计设想

假设我们对状态机的轮询是通过对一个状态栈的栈顶轮询来实现的:

那么初始情况我们将idle入栈,轮询idle

然后我们入栈run,轮询run状态,停止run以后,将run出栈继续轮询idle状态。

下面我们实现一下一个会被打断的技能如何制作:

初始入栈idle,入栈skill1,轮询skill1。

接受到释放skill2,出栈skill1,入栈skill2,轮询skill2。

下面我们实现一下一个不会被打断的技能如何 :

初始入栈idle,入栈skill1,轮询skill1。

入栈skill2,轮询skill2。

skill2结束出栈,轮询skill1,skill1结束出栈,轮询skill2。

Buff

万物皆可buff!。。。停停停

其实本人对这个问题也是思考良久,在灵光一闪下才给出了这个设计概念。

我做技能系统数据拆解的目的是为了能得出一个舒适的技能系统程序结构,也是为了理清思路,不希望在设计概念上有混淆不清的地方,不希望出现,buff是技能技能是buff傻傻分不清楚的情况。

所以在本人的技能系统狭义论中,buff系统是一个独立的系统。

而buff对于角色和任何实体本身来说是一种外来力量。

让我们展开中二一点的幻想

buff就是天地间无处不在的独立能量,有buff能量有debuff能量

你站在半人马酋长边上,半人马酋长释放战争践踏引动了天地间的眩晕buff能量,将debuff施加在了你的身上

朋友们细品一下,上面这个画面,包含了buff与技能的关系,buff与实体的关系,技能与实体的关系。

至于buff与buff之间的关系如何处理

那当然是交给buff系统内部啦

动画与特效与声音

特效的一部分受技能逻辑驱动。

动画仅受状态驱动,状态的上层是技能逻辑与buff与输入系统。

特效的一部分受状态的驱动。

技能逻辑

释放逻辑

一个技能的释放,必然有一个开始的节点

是否能够开始这个技能这部分判定逻辑也应是释放逻辑的一部分

本人在此先把释放前逻辑和释放后逻辑做一个拆分

比如说你玩卡尔释放天火的时候,按住T,技能范围提示光圈出现这时并不算释放了天火,属释放前逻辑。

鼠标按下光圈以后天火特效播放数据开始流动属技能逻辑。

传统意义上的ACT与Moba的直观区别--引出魔法弹概念

如果你是想做一个类似于拳皇的游戏

那么你的技能逻辑会相对简单,八神的地火、萧峰都只是简单的单次判定或者简单多次判定逻辑。

类似的还有DNF剑魂的幻影剑舞,流系列技能。

以上可以对ACT做一个小结:释放前逻辑复杂,释放后逻辑简单。

但如果你想做一个moba类游戏

那么你面临的技能需求可能五花八门。

拿dota2举几个例子

宙斯:C技能 闪电链释放出一道闪电会在有限数量且在视野内的敌人之间跳跃,且不会重复跳跃。

巫医:大招 插上一根棍子,不停的向周围的敌人弹射特效且是物理伤害

风行:E技能 发射之后可以捆住一条线上的敌人树也可以触发捆绑效果,若没有则眩晕一瞬

可以看到moba的技能逻辑可以相当的复杂

事实上任何游戏的技能,只要你想都可以达到很复杂的程度

所以这里我们引出魔法弹的概念

魔法弹

一个复杂技能的效果是很多原子效果堆叠出来的结果

假设我们发射一颗带有魔法的子弹,这颗子弹在接触到目标或者受到某种触发后可以有无数种后续,而这无数种后续的个体又可以分别对应各自的无数种后续。依次类推。

这颗魔法弹技能的效果---这无数无数的后续,是每个单次触发的效果(原子效果)的总和。

如何实现魔法弹

行为树(方案之1)

行为树可以很好的担起制作魔法弹的任务

当我们释放出一颗魔法弹后,这颗魔法弹上所蕴含的魔法就可以是一颗行为树

行为树可以很好的驱动,状态,buf,hit等模块,实现一个复杂的技能效果

小结

引入ACT的释放前逻辑复杂体现释放前逻辑的重要性,目前认为重要到足以单独成块。

引入魔法弹概念可以对简单的技能逻辑进行向下兼容。

控制

1.输入

2.输入反馈

3.输入对于人物状态的控制能力

4.复杂的输入规则处理

数值

1.对技能有影响的数值

2.普通数值

其实这两个概念没有太大必要分开,这里只是分开来陈述一下而已,让我们对数值有个直观的印象。

首先我们要明确一件事情。

数值系统在概念上应该独立开来运行。

就像一个数据库一样,对外提供增删查改的接口。

每个人物的数据都是一个小的数据模块。

数值在技能代码模块中的设计非常重要。

因为数值需要频繁的调教。

如果把整个技能管线的制作比作制作出一个模型。

那么数值的调教就是给模型上色的过程。

这个上色并不单指表面的上色,而是由表及里由内而外的灵魂上色啊。

渲染

还不是很了解拉。

咱先用默认的管线好不好~ ~

写在后面

以上是目前阶段我对技能系统的一个概念设计

接下来我会去实践这个设计,buff系统,fsm,动画系统,数值,技能逻辑驱动-行为树,特效控制,输入系统等等。

每个系统内部也同样会有很多细节和概念。

这些我都会去一一去单独设计并制作出来。

相信整个管线搭建完成时候,我们可以很好调教出我们想要的效果,如好的打击感,好的操作手感。

值得一提的是,为了技能的编辑的可视性良好,我已经决定引入timeline的概念。

在构建这个技能系统的过程中,如果觉得哪里概念不通顺或者有更好的概念我还会回来修改


记录历程,整理思路,共享知识,分享思维。