UEC++实现事件分发机制

本文详细介绍了如何在Unreal Engine 4中实现事件分发机制,包括声明委托类型、注册事件映射、分发事件、移除事件和清除事件等步骤。通过这个机制,可以方便地进行观察者模式的实践,例如在UI交互、网络通讯等场景中。提供的代码示例展示了事件分发的关键部分。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

文章基于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); 蓝图访问不了函数指针*/

MQTT(Message Queuing Telemetry Transport)是一种轻量级的通信协议,用于连接物联网设备和云服务。UEC++是一种嵌入式C++语言,可用于开发嵌入式系统。在UEC++实现MQTT协议需要使用MQTT协议栈库和UEC++的网络编程库。 以下是一个简单的UEC++程序,演示如何使用MQTT协议栈库实现MQTT协议。此示例程序使用MQTT客户端连接到MQTT服务器,并订阅一个主题,然后等待消息。 ```cpp #include <mqtt.h> #include <stdio.h> int main() { // 连接到MQTT服务器 struct mqtt_connect_client_info_t info = MQTT_CONNECT_CLIENT_INFO_INITIALIZER; info.client_id = "uec_mqtt_client"; info.username = "your_username"; info.password = "your_password"; struct mqtt_client_t *client = mqtt_client_new(); mqtt_client_connect(client, "your_mqtt_server", 1883, &info); // 订阅主题 mqtt_client_subscribe(client, "your_topic", 0); // 循环等待消息 while (1) { struct mqtt_response_publish_t *publish = mqtt_client_receive(client, 1000); if (publish) { char *payload = (char *)publish->application_message.payload; int payload_len = publish->application_message.payload_len; printf("Received message: %.*s\n", payload_len, payload); mqtt_response_publish_free(publish); } } // 关闭连接 mqtt_client_disconnect(client); mqtt_client_free(client); return 0; } ``` 在这个例子中,我们使用MQTT协议栈库中的函数,连接到MQTT服务器,并订阅一个主题。然后,我们使用一个循环来等待来自服务器的消息。当我们接收到一条消息时,我们打印出它的内容。最后,我们关闭连接并释放内存。 注意,这只是一个简单的示例程序,仅用于演示如何使用MQTT协议栈库在UEC++实现MQTT协议。实际应用中,你需要根据实际情况修改代码,并确保代码的正确性和稳定性。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值