连招的实现逻辑

此处以一个攻击动画的蒙太奇动作为例

image-20231212194111745

此处我将时间线分为了3部分:

  1. 招式起手动画,也就是所谓的前摇,此时还不会产生伤害。
  2. 攻击动画,此部分动画会放送攻击部分,若在此期间玩家的武器与敌人发生碰撞则应该造成伤害。
  3. 结束动画,角色收招并回到Idle模式,等待下一个指令,此部分也就是所谓的后摇。

对于连招来说,由于阶段1和阶段2是攻击的准备阶段,我们不应该在此时打断招式,而应该在进入后摇后再进行招式的切换来实现连招。此处涉及到一个由输入转换状态的问题,我们要实现的是如果在合适的时间段内按下对应的输入键,就应该打断目前的招式后摇并使用下一个技能。而Combo Graph插件(下文简称为CG插件)可以很方便地帮助我们根据输入做状态转换,它也提供了动画通知窗口方便自订上文我们所说的三段式技能分区以实现手感较好的连招。

本文记录了尽量不使用GAS系统情况下用CG插件实现连招。

Combo Graph使用教程

1. 安装与前期准备

CG插件可以在这里购买。

把它安装到你的引擎里,它会存在于你的项目目录的Plugins文件夹内。

UE5.0+ 用户需要将编辑器的 Edit / Project Settings / Project - Packaging栏中的 Packaging - Additional Asset Directories to Cook中添加/ComboGraph以防止崩溃:

image-20231212202542849

此外,你需要有一个已经写好了的Character角色与适量的攻击动画蒙太奇。CG插件需要用到Enhanced Input增强输入插件,也需要提前设置好。

2. 设置插件

首先,需要一个InputAction和一个InputMappingContext,在本文中,它们分别为IA_MainAttackIMC_Battle

然后,我们需要去插件设置中设置CG插件使用的图标包,前往Edit / Project / Plugins / Combo Graph,在Icons栏的Context Mapping中选择你的IMC文件,Icon Data Table中选择DT_ComboGraph_InputlconsMappings(可能已经是默认设置了):

image-20231212202606214

3. 创建一个Combo Graph

和创建一个蓝图一样的方式,在右键菜单中创建一张Combo Graph。

首先我们要设置Combo Graph,在右上的边栏中我们要设置Default Input Action和Context Mapping:

image-20231212204050742

然后来看本体,Combo Graph本质上是一个状态机,只不过上面的节点都是动画:

image-20231212203727137

(Entry作为起点,如果起点的输入有多种,则需要一个Conduit导管来做分支,若只有一个起始输入则不必要)

可以从右边的栏目里拖出动画作为节点,节点之间的连线为过渡的输入条件。点击连线,可以在右边的边栏选择需要的转移条件的InputAction:

image-20231212204254370

将动画之间的关系与切换所需的输入设置好,然后保存Combo Graph即可。

4. 调用Combo Graph

Character类中需要添加一个ComboGraphSystem组件,然后在对应的InputAction被激活时(事件),使用Start Combo Graph for Gameplay Task来启动一张Combo Graph。如下图所示, 在Task Owner中选择ComboGraphSystem组件(此处分开展示了):

image-20231212204453996

image-20231212204432744

记得要在Initial Input中选择你的起始输入的InputAction否则不会生效。

此时模拟游戏则可以触发连招了,但是每次下一个动画都会在上一个动画淡出后才进行播放。

5. 碰撞设置

CG插件预设了碰撞检测系统,你要做的只有给你的武器需要检测的部位安装插槽以及激活碰撞检测组件。

首先在武器里添加插槽,无论是静态网格体还是骨骼网格体的武器都可以,只要将插槽放置在需要检测的部位。如图,我添加了3个插槽:

image-20231212213352183

插槽不需要特定的命名规则,直接添加即可。

然后在Character类中添加名为ComboGraphCollision的组件,并且在该组件被激活的时候用Register Collision Mesh将武器的网格体登记到该组件上:

image-20231212213556606

至此,我们需要在蒙太奇中指明开启碰撞检测的时间。CG插件提供了Combo Graph: Collision Window的蒙太奇通知窗口,将它拖到蒙太奇中正在攻击的那部分位置,则在攻击时CG插件会自动启动碰撞检测。

ComboGraphCollision组件中勾选Debug后我们启动游戏就可以看到碰撞检测的框了,如图:

image-20231212214110753

如何获取到被碰撞的物体呢?

image-20231212220130363

6. 也许你想造成伤害?

Combo Graph中的Gameplay Effects模块中集成了碰撞时造成伤害以及效果的功能,可以与碰撞完美衔接使用。

需要造成伤害的话可以在Combo Graph的动画节点中将 Gameplay Effects - Damage Handling Method改成Unreal’s Damage System,然后在Damages Container Map中新增一项。此处需要添加一个Gameplay的Tag,建议自己新建一个Tag,例如我这边选择的是Event.Damage,并且设置伤害值:

image-20231213150240783

然后去上面说的接收碰撞事件的节点那边,按如下注册消息:

image-20231213164334449

如此之后便可以在受碰撞的Actor中通过Any Damage接收到伤害了。

7. 攻击效果

攻击效果(例如击中音效/特效)也可以在Combo Graph中借助Gameplay Cues生成。

要添加Gameplay Cues,除了上述的Gameplay的Tag,还需要建立一个Gameplay Cue Tag:

首先在一个目录下新建一个ComboGraphGameplayCueNotify_HitImpact类:

image-20231213163225748

然后打开该类,在右边直接建立tag(例如我建立了Hit):

image-20231213163343960

此后在UE的项目目录/Config/DefaultGame.ini的最后添加以下内容:

[/Script/GameplayAbilities.AbilitySystemGlobals]
AbilitySystemGlobalsClassName=/Script/ComboGraph.ComboGraphAbilitySystemGlobals
+GameplayCueNotifyPaths="/Game"

第三行中,要指明刚刚建立的Cue类的目录,但是不用指明Content目录,例如我如果把类直接放在Content下,就直接写/Game,如果放在Content下的AAA文件夹里,就写/Game/AAA。然后重启编辑器。

然后就可以在Gameplay Cue(Hit Impacts)栏目里写自己要加入的效果了,需要注意一下的是Tag的选择,在Gameplay Cue Tags中一定要选刚刚新建的Cue Tag。

image-20231213164103101

可以同时加入多种效果,例如声音,Niagara和传统粒子系统。

8. 调整手感

之前的连招都是要等到前一段攻击动画的蒙太奇淡出之后才能衔接播放下一段,这就导致每回都播放完整后摇,手感很不好,而连招应该是要能打断后摇发动下一波攻击的,因此我们可以改变动画之间的衔接条件。

单击Combo Graph中的过渡节点,可以看到如下栏目:

image-20231213165100108

你可以选择Transition on a specific Anim Notify Frame,然后在下方选择你要使用的动画通知。这边建议新建一个什么都不用做的动画通知,专门用来处理这个事情。

这个动画通知一般放在上面的Collision Window的后面一点点位置,这样一旦播放到此处,它就可以开始下一个技能的播放,而不需要再看冗长的后摇动画了。

9. 展望

配合增强输入,其实还可以实现输入缓冲等优化手感的操作,让连招变得更加方便,手感更好。并且还可以借此实现后摇重置,闪避打断等操作。