何时对代理使用UFUNCTION



在UnrealEngine中,UFUNCTION用于通过蓝图使用、复制和委托的附加说明符来丰富函数。

然而,有些委托类型似乎不允许绑定UFUNCTION(像多播委托(,而其他类型则需要绑定UFUNCTION(像动态多播委托一样(。

是否有可用的概述,什么委托类型接受哪种类型的函数(普通c++或UFUNCTION(?

只有动态委托需要可以被限制为UFUNCTION的函数。

+-----------------------------------------------+----------------------+--------------------+
| Type                                          |  binds c++ function  |  binds `UFUNCTION` |
+-----------------------------------------------+----------------------+--------------------+
| Singlecast                                    |  yes                 |  yes               |
| Multicast                                     |  yes                 |  no                |
| Event                                         |  yes                 |  ?                 |
| Dynamic singlecast                            |  no                  |  yes               |
| Dynamic multicast                             |  no                  |  yes               |
| `FTimerDelegate` (singlecast)                 |  yes                 |  yes               |
| `FTimerDynamicDelegate` (dynamic singlecast)  |  no                  |  yes               |
+-----------------------------------------------+----------------------+--------------------+

(这是我到目前为止的观察结果。如果有错误,请评论或编辑或添加答案。(

性能

UFUNCTION增加了编译时间和工件大小,因此只有在调用代码需要时才使用宏。

动态委托支持序列化,具有用于在蓝图图中工作的附加代码(在BP中称为Events/Event Dispatcher(,并且比其他委托类型慢。如果您只需要C++的委托,那么大多数时候就不需要动态委托。

C++模板对非动态委托的支持

接受c++函数绑定的委托可以用模板包装

template<typename T>
struct MyTemplateWrapper
{
DECLARE_MULTICAST_DELEGATE_OneParam(FMyDelegateWithTemplate, T);
};

MyTemplateWrapper<float>::FMyDelegateWithTemplate MyCallback;一样使用它。

请记住:MyCallback不支持UPROPERTY宏,因为MyTemplateWrapper不能是USTRUCT/UCLASS(因为它们不支持模板(。然而,由于动态委托类型不支持蓝图,因此缺少UPROPERTY并不是一个损失。

主题外:UFUNCTION的附加用法

不真实答案的简短总结。

最新更新