何时为代表使用 UFUNCTION

Roi*_*ton 3 delegates unreal-engine4

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

但是,某些委托类型似乎不允许绑定 a UFUNCTION(如多播委托),而其他类型则需要绑定 a UFUNCTION(如动态多播委托)。

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

Roi*_*ton 5

只有动态 委托需要可以绑定为 a 的函数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               |
+-----------------------------------------------+----------------------+--------------------+
Run Code Online (Sandbox Code Playgroud)

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

表现

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

动态委托支持序列化,具有在蓝图图中工作的额外代码(在 BP 中称为事件/事件调度器),并且比其他委托类型慢。如果您只需要 C++ 的委托,则大多数时候您不需要动态委托。

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

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

template<typename T>
struct MyTemplateWrapper
{
    DECLARE_MULTICAST_DELEGATE_OneParam(FMyDelegateWithTemplate, T);
};
Run Code Online (Sandbox Code Playgroud)

MyTemplateWrapper<float>::FMyDelegateWithTemplate MyCallback;.

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

题外话:其他用法 UFUNCTION

虚幻答案的简短摘要。