前言
文章基于4.27.2发布版本实现的事件分发(在网络通讯层方面非常好用),如果对你受益,请点赞+关注,这将是我更新的动力。
众所周知,事件分发机制属于观察者模式。在该模式中,一个被观察者对象(也称为主题)维护其依赖者列表,并在其状态发生变化时通知它们。事件分发机制就是用来通知和分发事件给订阅者或监听器的实现。
举个例子,一个简单的UI,其中包含一个按钮和一个文本框。当用户单击按钮时,应用程序将读取文本框文本并在控制台上打印它。在这种情况下,按钮是主题,它维护了一个依赖者列表,即订阅了按钮单击事件的监听器的列表。文本框也可以是另一个主题(被观察者对象),以便应用程序可以在文本框内容更改时更新其状态并通知相关的监听器。
言归正传
一般来说,事件分发一般具有一下特性:
1.声明委托类型
方便分发事件传参,这里我声明了一个FString类型参数的委托,然后再声明消息映射容器
DECLARE_DYNAMIC_DELEGATE_OneParam(FDispatcherDelegate, FString, Param1Name);
//避免使用inline不能跨模块使用的隐患
static TMap<FString, TArray<FDispatcherDelegate>>& GetDispatcherDelegateMap();
2.注册事件映射
可以设置不同类型的键值类型,但是必须值要是委托方法才行,我这里注册的委托会添加到一个TArray的委托容器中,可以一个key绑定多个值
//注册事件
UFUNCTION(BlueprintCallable, Category = "UEventManageBPFunctionLib|EventDispatcher")
static void RegisteredEvent(const FString eventKey, FDispatcherDelegate evetDelegateVaule);
3.分发事件
根据key,广播通知对应容器里所有事件
//派发事件
UFUNCTION(BlueprintCallable, Category = "UEventManageBPFunctionLib|EventDispatcher")
static FString DispatcherEvent(const FString eventKey, const FString arguments);
4.移除事件
可以根据key查到事件容器,移除其中我们传入的委托
//移除事件
UFUNCTION(BlueprintCallable, Category = "UEventManageBPFunctionLib|EventDispatcher")
static void RemoveEvent(const FString eventKey, FDispatcherDelegate evetDelegateVaule);
5.清除事件
在UE Edit中不会回收static类型事件容器(编辑器模式),所以就需要在结束游戏时调用清除事件
//清空事件
UFUNCTION(BlueprintCallable, Category = "UEventManageBPFunctionLib|EventDispatcher")
static void ClearEvents();
放出代码
EventManageBPFunctionLib.h
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "Kismet/BlueprintFunctionLibrary.h"
#include "EventManageBPFunctionLib.generated.h"
DECLARE_DYNAMIC_DELEGATE_OneParam(FDispatcherDelegate, FString, Param1Name);
/*typedef int (*DispatcherEventPtr)(FString Param1Name); 蓝图访问不了函数指针*/