单播
定义和申明
使用宏相当于申明一个代理类.
DECLARE_DELEGATE( FSimpleDelegate ); // 无参、无返回值 DECLARE_DELEGATE_OneParam(FPakEncryptionKeyDelegate, uint8[32]); // 1个参数、无返回值 DECLARE_DELEGATE_TwoParams(FPakSigningKeysDelegate, TArray<uint8>&, TArray<uint8>&); // 2个参数、无返回值 DECLARE_DELEGATE_RetVal_ThreeParams(bool, FOnMountPak, const FString&, int32, IPlatformFile::FDirectoryVisitor*); // 3个参数、bool返回值
实例化
//"实例化"单播代理,此处无法返回给蓝图,因此不需要UFUNCTION FTestDelegate TestDelegate;
绑定函数到代理
触发或执行绑定函数(调用)
多播
定义
//多播委托 DECLARE_MULTICAST_DELEGATE(DelegateName); DECLARE_MULTICAST_DELEGATE_ONEPARAM(DelegateName, Param1Type); DECLARE_MULTICAST_DELEGATE_XXXPARAMS(DelegateName, Param1Type,...);
绑定函数
多播触发
事件
事件定义和声明
注意1:事件第一个参数为'拥有'此事件的类型B,即类型B为事件的友元类,可以访问事件中的私有成员,例如broadcast函数
注意2:定时事件宏一般放在一个类的内部,即访问该类型时需要带上所在类的名称前缀,如(ATPSProjectCharacter::FCharacterEvent),可以有限减少事件类型名称冲突
//定义 DECLARE_EVENT(UWorld, FOnTickFlushEvent); // 无参 DECLARE_EVENT_OneParam(ATPSProjectCharacter, FCharacterEvent, int); // 一个参数TBaseMulticastDelegate<void, int> //声明 FCharacterEvent CharacterEvent;
绑定和触发
绑定
绑定方式和多播相同,参考多播绑定
触发
动态代理和动态多播代理
动态代理相比于标准代理,动态委托可序列化,让其可以在蓝图中进行调用,其函数可按命名查找,但其执行速度比常规委托慢
注意:动态委托可以作为函数参数使用,只有动态多播委托可以作为变量给蓝图绑定和调用
//定义 DECLARE_DYNAMIC_DELEGATE(DelegateName); //动态单播委托 DECLARE_DYNAMIC_DELEGATE_XXXPARAMS(DelegateName, Param1Type,...); DECLARE_DYNAMIC_DELEGATE_RetVal(EMouseCursor::Type, FGetMouseCursor); DECLARE_DYNAMIC_DELEGATE_RetVal_TwoParams(FEventReply, FOnPointerEvent, FGeometry, MyGeometry, const FPointerEvent&, MouseEvent); DECLARE_DYNAMIC_MULTICAST_DELEGATE(DelegateName); //动态多播委托 DECLARE_DYNAMIC_MULTICAST_DELEGATE_ONEPARAM(DelegateName, Param1Type, Param1Name); DECLARE_DYNAMIC_MULTICAST_DELEGATE_XXXPARAM(DelegateName, Param1Type, Param1Name,...); //声明 FCharacterDelegate_Dynamic DelegateName; //动态单播委托 UPROPERTY(BlueprintAssignable, Category = "Test") //动态多播委托,使用BlueprintAssignable可以让其在蓝图中被使用 FCharacterDelegate_DynamicMulticast DelegateName;