Loading

UE5——GAS实现连招的一种方案【前篇】

前言

最近因为在研究GAS编写连招,在Google上很幸运搜到了一篇日本博主写的GAS编写连招的方案,于是就打算贴出来分享一下,顺便讲讲实现的心得:

【UE5】GamePlayAbilitySystemによるコンボ攻撃の実装とそれに利用する小ネタ 前編【GAS】

【UE5】GamePlayAbilitySystemによるコンボ攻撃の実装とそれに利用する小ネタ 後編【GAS】

注:以下内容皆已假定读者已具备初步的GAS系统相关概念与其创建方式

方案讲解

1.蒙太奇的准备

首先你需要创建一个连招蒙太奇(把连招各个招式Sequence放到一个Montage里面,并添加不同的Section标明),类似于下图:

image-20240617110112279

然后把Section之间的Link移除

image-20240617110206201image-20240617110227849

2.GA(GameplayAbility)的准备

右键单击内容浏览器中的空白区域,然后选择 GameplayAbility Blueprint → 创建

image-20240617110558886

然后继承于GameplayAbility

image-20240617110710713image-20240617110822785

然后我们打开我们刚创建的GA的蓝图,并在其EventActivateAbilty中添加以下结点:

image-20240617112008622

然后我们在其Class Default中为GA添加Tag用于控制GA激活条件:

image-20240617112242340

由于最开始我们都没有Tag,所以我们需要添加自己所需要的tag(Tag会按照.进行树形划分):

image-20240617112452489

添加如下的Tag

image-20240617112939412

Ability Tags: 用于激活GA

Activation Owned Tags: 当GA被激活时,Owner会添加上这些Tag

Activation Blocked Tags: 当拥有这些Tag其中之一的时候,此GA不会被激活

至此,GA的准备工作就已经完成

3.赋予GA与激活GA

首先在Character的蓝图中加入GAS的Component

image-20240617161502330

然后我们创建一个Ability数组,用于赋予Character最开始的GA

image-20240617161542289

然后我们在BeginPlay的时候给予Character这些GA, 并且添加一个DebugKey用于激活我们刚刚写的GA:

image-20240617161645488

4.连招★

在做连招之前,我们需要了解连招的各个时段。一般来说连招会在一段区间中,用户的输入才有效,比如你飞快的点两下鼠标,不会直接触发第二招;你两次点击间隔稍短,会需要等一小会儿才会触发下一招;你要是两次点击间隔稍长,就会直接下一式;你要是间隔很长,可能就会重新触发第一式,所以连招的实现就会类似下图。

image-20240617165153171

所以我们的设计思路就是,在蓝色的区间内,认为玩家的输入是有效的,然后会在紫色的区间内,如果检测到玩家的输入,那么就可以触发下一连招,于是我们就需要做到以下的事情:

  1. 在蓝色区间中的输入才算成功(用Activation Required Tags实现)
  2. 蓝色区间中成功输入后,等到紫色区间在播动画(用Wait GameplayEvent + 一个等待Tag 实现)

于是我们先创建GA_Attack_02, 并连接节点与添加对应Tag:

image-20240617172608059

注上面的GA_Attack_02的Tag设置错了,以下为正确的:

image-20240625200518909

在Character中赋予

image-20240617172715095

然后我们就要解决Montage播放途中的那两个区间的事情,这个时候就轮到非常好用的AnimNotifyState登场

蓝色区域(等待用户输入)的编写

我们右键内容浏览器的空白处,选择 Blueprints -> All Classes中搜索 AnimNotifyState

image-20240617191620215

创建了一个ANS_AttackReady用于给Owner添加ReadyTag

image-20240617192006048image-20240617193001682

然后我们打开刚刚创建的ANS的蓝图,给他创建一个变量用于传入ReadyTag,然后重写其Begin与End方法

image-20240617193104993

记得要公开,不然没办法让外界输入

image-20240617194401422

image-20240617193128238

image-20240617193147289

紫色区域(播放连招)的编写

我们同样也用AnimNotifyState来写,创建一个ANS_AttackBranch,并且重写他的Tick方法,用来激活等待Ability.State.NextAttack事件的Ability(下一连招)

image-20240617193944178

两个区间的放置

我们在我们的连招Montage的Notifies中添加好我们刚写完的两个ANS,然后稍微调整一下范围

image-20240617194824450

不要忘记把这个ANS的ReadyTag加上

image-20240617195131212

结语

网上还有另一种方式,是《幻塔》分享的GameplayAbility框架在《幻塔》手游中的应用及优化。《幻塔》也是用了GAS系统,并且对于连招的实现是通过实现了一个Map用于决定下一步跳转的连招,这篇文章讲得不多(毕竟还是人家的饭碗)...

Demo项目地址:Vikyanite/GASDemo (github.com) / Vikyanite/GASDemo (gitee.com)

接下来我会修改这个方案让其在多人联机下的也表现良好:

posted @ 2024-06-17 20:11  ViKyanite  阅读(69)  评论(0编辑  收藏  举报