事件本身和多播代理一样,为了操作的安全性,事件提供了额外的操作限定。即禁止在声明事件对象的外部调用事件传播,清理,检查等函数。通过操作隔离,最大程度的增加了事件的安全性。派生类允许调用事件的广播。
在虚幻C++中事件和多播几乎相同。只是构建方式略不同
构建宏
事件类型构建宏由于需要限定事件对象调用约束关系,需要提供声明所在类型,并且需要在类内部进行声明。事件没有返回值。
声明宏 |
描述 |
---|---|
|
创建一个事件。 |
|
创建带一个参数的事件。 |
|
创建带两个参数的事件。 |
|
创建带 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("无返回值无参数函数调用!")); }
测试结果:
标签:多播,调用,函数,委托,C++,FActorEvent,事件,UE From: https://www.cnblogs.com/limu-zy/p/16719956.html