动态代理 - 游戏蛮牛 - Unreal中文翻译用户手册

动态代理

动态代理可以进行序列化,可以通过名称查找它们函数,其执行速度比常规代理慢。

声明动态代理

动态代理的声明方式和声明标准代理 一样,只是它们使用针对于动态代理的宏变种。

声明宏 描述
DECLARE_DYNAMIC_DELEGATE[_Const, _RetVal, etc.]( DelegateName ) 创建一个动态代理。
DECLARE_DYNAMIC_MULTICAST_DELEGATE[_Const, _RetVal, etc.]( DelegateName ) 创建一个动态的多播代理。
DECLARE_DYNAMIC_DELEGATE[_Const, _RetVal, etc.]( DelegateName ) 创建一个封装的动态代理。
DECLARE_DYNAMIC_MULTICAST_DELEGATE[_Const, _RetVal, etc.]( DelegateName ) 创建一个封装的动态多播代理。

动态代理绑定

辅助宏 描述
BindDynamic( UserObject, FuncName ) 在动态代理上调用BindDynamic()的辅助宏。自动生成函数名称字符串。
AddDynamic( UserObject, FuncName ) 在动态多播代理上调用AddDynamic()的辅助宏。自动生成函数名称字符串。
RemoveDynamic( UserObject, FuncName ) 在动态多播代理上调用RemoveDynamic()的辅助宏。自动生成函数名称字符串。

执行动态代理

绑定到代理上的函数可以通过调用代理的 Execute() 函数进行执行。在执行这些函数之前您必须检查是否已经“绑定”了代理。这是为了使得代码更加安全,因为可能代理有时会具有未初始化且后续要访问的返回值及输出参数。执行一个未绑定的代理实际上有时会扰乱内存。您可以调用 IsBound() 来判断执行该代理是否安全。同时,对于没有返回值的代理,您可以调用 ExecuteIfBound() 函数,但是一定要注意那些可能未初始化的输出参数。

执行函数 描述
Execute()
ExecuteIfBound()
IsBound()

请参照 多播代理 获得执行多播代理的详细信息。

封装的动态代理

动态代理声明时可以具有一个执行该代理的封装器代理方法。

声明宏 描述
DECLARE_DYNAMIC_DELEGATE[_Const, _RetVal, etc.]( DelegateName ) 创建一个封装的动态代理。
DECLARE_DYNAMIC_MULTICAST_DELEGATE[_Const, _RetVal, etc.]( DelegateName ) 创建一个封装的动态多播代理。