UEC++ 事件

事件本身和多播代理一样,为了操作的安全性,事件提供了额外的操作限定。即禁止在声明事件对象的外部调用事件传播,清理,检查等函数。通过操作隔离,最大程度的增加了事件的安全性。派生类允许调用事件的广播。

在虚幻C++中事件和多播几乎相同。只是构建方式略不同

构建宏

事件类型构建宏由于需要限定事件对象调用约束关系,需要提供声明所在类型,并且需要在类内部进行声明。事件没有返回值。

声明宏

描述

DECLARE_EVENT( OwningType, EventName )

创建一个事件。

DECLARE_EVENT_OneParam( OwningType, EventName, Param1Type )

创建带一个参数的事件。

DECLARE_EVENT_TwoParams( OwningType, EventName, Param1Type, Param2Type )

创建带两个参数的事件。

DECLARE_EVENT_<Num>Params( OwningType, EventName, Param1Type, Param2Type, ...)

创建带 N 个参数的事件。

 

注:OwningType即当前声明事件的类

绑定函数与广播:与多播代理的绑定相同

函数

说明

"Add()"

将函数委托添加到该多播委托的调用列表中。

"AddStatic()"

添加原始C++指针全局函数委托。

"AddRaw()"

添加原始C++指针委托。原始指针不使用任何类型的引用,因此如果从委托下面删除了对象,则调用此函数可能不安全。调用Execute()时请小心!

"AddSP()"

添加基于共享指针的(快速、非线程安全)成员函数委托。共享指针委托保留对对象的弱引用。

"AddUObject()"

添加基于UObject的成员函数委托。UObject委托保留对对象的弱引用。

"Remove()"

从该多播委托的调用列表中删除函数(性能为O(N))。请注意,委托的顺序可能不会被保留!

"RemoveAll()"

从该多播委托的调用列表中删除绑定到指定UserObject的所有函数。请注意,委托的顺序可能不会被保留!

执行:调用函数Broadcast,但是调用不保证执行顺序的正确性。事件广播无需检查是否存在有效的绑定。事件广播应发生在声明事件类型的类内部。

事件构建步骤:

// Actor1.h
protected:
    class AActor2* ac2;
public:
  // 事件在类内定义 DECLARE_EVENT(AActor1, FActorEvent) FActorEvent
& OnChanged_FActorEvent() { return actorEvent; } private: FActorEvent actorEvent; // Actor1.cpp ac2 = GetWorld()->SpawnActor<AActor2>(AActor2::StaticClass()); OnChanged_FActorEvent().AddUObject(ac2, &AActor2::CallBackNone); OnChanged_FActorEvent().Broadcast(); ////////////////////////////////////////////////// // Actor2.h void CallBackNone(); // Actor2.cpp void AActor2::CallBackNone() { UKismetSystemLibrary::PrintString(this, TEXT("无返回值无参数函数调用!")); }

测试结果:

 

posted @ 2022-09-22 16:54  黎沐不吃香菜  阅读(567)  评论(0编辑  收藏  举报