在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
的附加用法
不真实答案的简短总结。