UE4之Delegate:动态组播

UE4的动态多播Delegate基于动态单播,通过TBaseDynamicMulticastDelegate类实现,其中Broadcast方法需在子类中自定义。动态多播使用TArray<TScriptDelegate>的InvocationList存储动态单播,并通过__Internal_AddDynamic、__Internal_AddUniqueDynamic、__Internal_RemoveDynamic进行绑定和移除操作。关键的Execute方法遍历并执行符合条件的动态单播的ProcessDelegate,整个过程由UHT生成的_DelegateWrapper辅助完成。
摘要由CSDN通过智能技术生成

动态多播和动态单播一样,都会用UHT生成一个_DELEGATE宏来定义一个_DelegateWrapper函数.

#define DECLARE_DYNAMIC_MULTICAST_DELEGATE( DelegateName ) BODY_MACRO_COMBINE(CURRENT_FILE_ID,_,__LINE__,_DELEGATE) FUNC_DECLARE_DYNAMIC_MULTICAST_DELEGATE( FWeakObjectPtr, DelegateName, DelegateName##_DelegateWrapper, , FUNC_CONCAT( *this ), void )

#define FUNC_DECLARE_DYNAMIC_MULTICAST_DELEGATE(TWeakPtr, DynamicMulticastDelegateName, ExecFunction, FuncParamList, FuncParamPassThru, ...) \
class DynamicMulticastDelegateName : public TBaseDynamicMulticastDelegate<TWeakPtr, __VA_ARGS__> \
{ \
public: \
	DynamicMulticastDelegateName() {} \
	explicit DynamicMulticastDelegateName( const TMulticastScriptDelegate<>& InMulticastScriptDelegate ) \
		: TBaseDynamicMulticastDelegate<TWeakPtr, __VA_ARGS__>( InMulticastScriptDelegate ) \
	{ \
	} \
	\
	/** Broadcasts this delegate to all bound objects, except to those that may have expired */ \
	void Broadcast( FuncParamList ) const \
	{
    \
		ExecFunction( FuncParamPassThru ); \
	} \
};

可以看到,动态多播是一个TBaseDynamicMulticastDelegate子类, Broadcast()方法必须在子类中实现,因此我们在自己的动态多播类里实现了Broadcast方法.

template <typename TWeakPtr, typename RetValType, typename... ParamTypes>
class TBaseDynamicMulticastDelegate : public TMulticastScriptDelegate<TWeakPtr>
{
   
public:
	typedef TBaseDynamicDelegate<FWeakObjectPtr, RetValType, ParamTypes...> FDelegate;

	template< class UserClass >
	void __Internal_AddDynamic( UserClass* InUserObject, typename FDelegate::template TMethodPtrResolver< UserClass >::FMethodPtr InMethodPtr, FName InFunctionName )
	{
   
		check( InUserObject != nullptr && InMethodPtr != nullptr );
		
		FDelegate NewDelegate;
		NewDelegate.__Internal_BindDynamic( InUserObject, InMethodPtr, InFunctionName );
		this->Add( NewDelegate );
	}

	template< class UserClass 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值