GAS实现连招的一种方案【后篇】
前言
上文已经分享了一个用WaitGameplayEvent与AnimNotifyState来实现连招的方案,但是这个方案在多人联机的表现下却不是很好
原因
让我们先了解一下Client调用TryActivateAbility()
在多人联机的过程:
简而言之,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,并且取消异步等待事件:
然后在BP_DemoCharacter中添加一个GameplayTag变量,记得将变量改成Public,用于给ANS改变DebugKey触发的Tag
之后把之前的ANS_AttackBranch
改为ANS_Input,并且把其Begin与End改为下图:
然后在对应的Montage的区间中设置这个Tag就好
结语
虽然之前的那个博主的思路很好,但是确实也不适用于多人联机下的连招。要是UE有官方的做ACT的教程就好了,就连官方的ActionRPG也是不支持多人联机的。还是希望有佬能分享自己的多人联机连招实现心得...
Demo项目地址:Vikyanite/GASDemo (github.com) / Vikyanite/GASDemo (gitee.com)