avatar
罗传月武(YueWu)@罗传月武(yuewu)
技术
UE

【GampayAbility深入解析】之Tag事件处理

logo unreal

前言

AbilitySystemComponent,简称ASC,是AbilitySystem中最核心的一个组件。

这次要谈的是ASC中的GameplayTag事件处理。

传统中游戏的事件处理一般是一个TMap<事件名,事件多播回调>的形式。在AbilitySystem中事件名由GameplayTags代替,可以对ASC触发事件以及监听ASC上的某个事件。

ASC中有如下定义:

TMap<FGameplayTag, FGameplayEventMulticastDelegate> GenericGameplayEventCallbacks;

Tag事件,存储单个GameplayTag以及对应的多播委托,用于注册单个Tag完全匹配事件。

TArray<TPair<FGameplayTagContainer, FGameplayEventTagMulticastDelegate>> GameplayEventTagContainerDelegates;

Tag容器事件。存储Tag容器(多个Tag)以及对应的多播委托。用于任意Tag匹配事件。


事件的绑定/解绑:

对于Tag事件(本质是个Map),直接对该委托进行绑定即可。

MyHandle = ASC->GenericGameplayEventCallbacks.FindOrAdd(Tag).AddUObject(this, &UAbilityTask_WaitGameplayEvent::GameplayEventCallback);

ASC->GenericGameplayEventCallbacks.FindOrAdd(Tag).Remove(MyHandle);

对于Tag容器事件,使用AddGameplayEventTagContainerDelegate和RemoveGameplayEventTagContainerDelegate。


事件的触发:

可以通过SendGameplayEvent在ASC上触发指定Tag对应的事件,Taget是目标ASC。内部会调用目标ASC上的HandleGameplayEvent,只要是存在与指定Tag匹配的事件存在,就会执行回调,同时还可以传递GameplayEventData存放事件中的涉及的数据。

513d0e24-7dbb-418d-ac34-842d0f24b3ea.jpg

在蓝图中对Tag/Tags事件进行监听。

GameplayAbilities插件默认也提供了AbilityTask_WaitGameplayEvent方便在蓝图中对事件进行监听。


OnlyMatchExact决定了事件是绑定在Tag事件还是Tag容器事件中的。

d3b4680f-7c0e-4a80-9ff2-1211474de88c.jpg



最后请注意,ASC中的Tag事件并没有任何网络同步逻辑,对同一个ASC组件的服务端/客户端版本,在服务端触发一个事件,就必须在服务端的地方去监听才会被触发。