UE4之Delegate:动态组播

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

动态多播和动态单播一样,都会用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 
UE中的DECLARE_EVENT是一个宏,用于声明一个事件。事件是一种特殊的多委托,用于实现异步、一对多和主体广的功能。它可以让任意类对象向特定事件进行注册,并在事件发生时得到通知并进行处理。DECLARE_EVENT的语法如下: ``` DECLARE_EVENT(OwningType, EventName, ReturnType, ...) ``` 其中,OwningType是拥有该事件的类,EventName是事件的名称,ReturnType是事件的返回类型,...是事件的参数列表。通过使用DECLARE_EVENT宏,可以方便地声明一个事件,并在需要的地方使用。 引用\[1\]提供了DECLARE_EVENT的源码示例,可以看到它是通过继承TMulticastDelegate类来实现的。需要注意的是,尽管该宏声明了一个只能由OwningType激活的多委托,但这种行为并没有被强制执行,并且在新的委托中被视为已弃用,建议使用普通的多委托代替。 总结起来,DECLARE_EVENT是UE中用于声明事件的宏,它可以实现异步、一对多和主体广的功能,让任意类对象能够注册和处理特定事件。 #### 引用[.reference_title] - *1* *3* [UE进阶实例43(UE中的委托、事件、单)](https://blog.youkuaiyun.com/inspironx/article/details/122826344)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [UE4_代理Delegate)](https://blog.youkuaiyun.com/longyanbuhui/article/details/76184140)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值