Loading

GAS实现连招的一种方案【后篇】

前言

上文已经分享了一个用WaitGameplayEventAnimNotifyState来实现连招的方案,但是这个方案在多人联机的表现下却不是很好

原因

让我们先了解一下Client调用TryActivateAbility()在多人联机的过程:

image-20240625201355992

简而言之,Client会先激活GA然后发送RPC给Server,Server一旦发现无法激活GA就会返回给Client让其回滚。这意味着,我们上一个方案的做法,有可能Server收到Client的RPC时,Server已经过了可以输入的区间了,于是就导致Server认为无法激活,Client回滚

所以我们之前的做法对于ACT游戏在多人联机下的表现是不可取的

分析

之所以server会回滚这次连招,其实是因为区间早就过去了,意味着Try GA_Combo2的时候,发现没有其Required的ReadyTag,于是导致回滚。那如果我GA的激活没有RequiredTag呢,是不是就不需要回滚了?意味着不管怎么说只要Client发起Try GA_Combo2,Server就会让其激活,不会回滚,于是我们便开始改造。

大体的改造思路就是,在可以输入区间中把TryActivateByTag中传入的Tag改为下一段Combo的AbilityTag,这样就可以避免RequiredTag与异步事件的干扰。缺点就是没有预输入的区间了,一旦在区间内输入就会立马播放下一段连招。

改造

之前我们的所有连招的GA的Abiltiy Tag都是Ability.Action.Attack,所以我们需要把各个Combo的Abiltiy Tag改成其独立的Tag,并且取消异步等待事件:

image-20240625203101243

然后在BP_DemoCharacter中添加一个GameplayTag变量,记得将变量改成Public,用于给ANS改变DebugKey触发的Tag

image-20240625203838065

之后把之前的ANS_AttackBranch改为ANS_Input,并且把其Begin与End改为下图:

image-20240625204108548

image-20240625204142560

然后在对应的Montage的区间中设置这个Tag就好

image-20240625204300847

结语

虽然之前的那个博主的思路很好,但是确实也不适用于多人联机下的连招。要是UE有官方的做ACT的教程就好了,就连官方的ActionRPG也是不支持多人联机的。还是希望有佬能分享自己的多人联机连招实现心得...

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

posted @ 2024-06-25 20:45  ViKyanite  阅读(15)  评论(0编辑  收藏  举报