UE中总计有7总类型的事件,每种的用途和功能各异,具体(一个参数作为参考):
>>UE中的任意委托或事件遵循UE的反射机制,需要使用UFUNCTION()
标记回调方法
#1.单播,只能1对1
API 源码:
/**
* Declares a delegate that can only bind to one native function at a time
*
* @note: The last parameter is variadic and is used as the 'template args' for this delegate's classes (__VA_ARGS__)
* @note: To avoid issues with macro expansion breaking code navigation, make sure the type/class name macro params are unique across all of these macros
*/
#define FUNC_DECLARE_DELEGATE( DelegateName, ReturnType, ... ) \
typedef TDelegate<ReturnType(__VA_ARGS__)> DelegateName;
定义语法:DECLARE_DELEGATE_OneParam
绑定函数:
DelegateOneParamFunc DefineDelegateOneParam;
DefineDelegateOneParam.BindSP() // 绑定智能指针
DefineDelegateOneParam.BindLambda() // 绑定lambda
DefineDelegateOneParam.BindRaw() // 绑定原生方法
DefineDelegateOneParam.BindStatic() // 绑定静态方法
DefineDelegateOneParam.BindUFunction() // 绑定到UObject中的方法
DefineDelegateOneParam.BindUObject() // 绑定到UObject对象
DefineDelegateOneParam.BindWeakLambda()// 绑定到弱引用lambda
使用方法:
DefineDelegateOneParam.Execute() // 执行
DefineDelegateOneParam.ExecuteIfBound() // 执行(如果有绑定对象)
用途指数:🤍(基本没用)
#2. 多播或叫组播,1对多的关系,调用者可以广播,无界限调用,蓝图不可用
API 源码:
/** Declares a broadcast delegate that can bind to multiple native functions simultaneously */
#define FUNC_DECLARE_MULTICAST_DELEGATE( MulticastDelegateName, ReturnType, ... ) \
typedef TMulticastDelegate<ReturnType(__VA_ARGS__)> MulticastDelegateName;
定义语法:DECLARE_MULTICAST_DELEGATE_OneParam(MultiDelegateOneParamFunc, int)
绑定函数:
MultiDelegateOneParamFunc DefineMultiDelegateOneParam;
DefineMultiDelegateOneParam.AddSP() // 组播使用Add
DefineMultiDelegateOneParam.AddLambda()
DefineMultiDelegateOneParam.AddRaw()
DefineMultiDelegateOneParam.AddStatic()
DefineMultiDelegateOneParam.AddUFunction()
DefineMultiDelegateOneParam.AddUObject()
DefineMultiDelegateOneParam.AddWeakLambda()
使用方法:
DefineMultiDelegateOneParam.Broadcast(1) // 广播出去
用途指数:💙🧡💛
点评:因为纯C++层的多播,蓝图端监听不到
#3. UE中的事件,可用于异步,1对多,主体广播
API 源码:
/**
* Declares a multicast delegate that is meant to only be activated from OwningType
*
* @note: This behavior is not enforced and this type should be considered deprecated for new delegates, use normal multicast instead
*/
#define FUNC_DECLARE_EVENT( OwningType, EventName, ReturnType, ... ) \
class EventName : public TMulticastDelegate<ReturnType(__VA_ARGS__)> \
{
\