前言
最近因为在研究多人联机同步下的动作同步,在Google上很幸运搜到了一篇日本博主写的GAS编写连招的方案,于是就打算贴出来分享一下,顺便讲讲实现的心得:
【UE5】GamePlayAbilitySystemによるコンボ攻撃の実装とそれに利用する小ネタ 前編【GAS】
【UE5】GamePlayAbilitySystemによるコンボ攻撃の実装とそれに利用する小ネタ 後編【GAS】
注:以下内容皆已假定读者已具备初步的GAS系统相关概念与其创建方式
方案讲解
1.蒙太奇的准备
首先你需要创建一个连招蒙太奇(把连招各个招式Sequence放到一个Montage里面,并添加不同的Section标明),类似于下图:
然后把Section之间的Link移除
2.GA(GameplayAbility)的准备
右键单击内容浏览器中的空白区域,然后选择 GameplayAbility Blueprint → 创建
然后继承于GameplayAbility
然后我们打开我们刚创建的GA的蓝图,并在其EventActivateAbilty中添加以下结点:
然后我们在其Class Default中为GA添加Tag用于控制GA激活条件:
由于最开始我们都没有Tag,所以我们需要添加自己所需要的tag(Tag会按照.进行树形划分):
添加如下的Tag
Ability Tags: 用于激活GA
Activation Owned Tags: 当GA被激活时,Owner会添加上这些Tag
Activation Blocked Tags: 当拥有这些Tag其中之一的时候,此GA不会被激活
至此,GA的准备工作就已经完成
3.赋予GA与激活GA
首先在Character的蓝图中加入GAS的Component
然后我们创建一个Ability数组,用于赋予Character最开始的GA
然后我们在BeginPlay的时候给予Character这些GA, 并且添加一个DebugKey用于激活我们刚刚写的GA:
4.连招★
在做连招之前,我们需要了解连招的各个时段。一般来说连招会在一段区间中,用户的输入才有效,比如你飞快的点两下鼠标,不会直接触发第二招;你两次点击间隔稍短,会需要等一小会儿才会触发下一招;你要是两次点击间隔稍长,就会直接下一式;你要是间隔很长,可能就会重新触发第一式,所以连招的实现就会类似下图。
所以我们的设计思路就是,在蓝色的区间内,认为玩家的输入是有效的,然后会在紫色的区间内,如果检测到玩家的输入,那么就可以触发下一连招,于是我们就需要做到以下的事情:
- 在蓝色区间中的输入才算成功(用Activation Required Tags实现)
- 蓝色区间中成功输入后,等到紫色区间在播动画(用Wait GameplayEvent + 一个等待Tag 实现)
于是我们先创建GA_Attack_02, 并连接节点与添加对应Tag:
在Character中赋予
然后我们就要解决Montage播放途中的那两个区间的事情,这个时候就轮到非常好用的AnimNotifyState登场
蓝色区域(等待用户输入)的编写
我们右键内容浏览器的空白处,选择 Blueprints -> All Classes中搜索 AnimNotifyState
创建了一个ANS_AttackReady用于给Owner添加ReadyTag
然后我们打开刚刚创建的ANS的蓝图,给他创建一个变量用于传入ReadyTag,然后重写其Begin与End方法
记得要公开,不然没办法让外界输入
紫色区域(播放连招)的编写
我们同样也用AnimNotifyState来写,创建一个ANS_AttackBranch,并且重写他的Tick方法,用来激活等待Ability.State.NextAttack事件的Ability(下一连招)
两个区间的放置
我们在我们的连招Montage的Notifies中添加好我们刚写完的两个ANS,然后稍微调整一下范围
不要忘记把这个ANS的ReadyTag加上
结语
现在网上大部分的GAS实现连招都不是通过AnimNotifyState的方式,就导致蓝图会做比较多的控制工作。有幸看到这篇文章,帮我省去了很多时间,特此分享,同时也特别感谢博主将这种方式分享出来。
对了网上还有另一种方式,是《幻塔》分享的GameplayAbility框架在《幻塔》手游中的应用及优化。《幻塔》也是用了GAS系统,并且对于连招的实现是通过实现了一个Map用于决定下一步跳转的连招,这篇文章讲得不多(毕竟还是人家的饭碗)...
Demo项目地址:Vikyanite/GASDemo (github.com)
标签:Tag,GA,创建,GAS,添加,连招,UE5 From: https://www.cnblogs.com/Vikyanite/p/18253136