delegates - 何时为委托(delegate)使用 UFUNCTION

标签 delegates unreal-engine4

在虚幻引擎中,UFUNCTION用于通过附加说明符来丰富功能,以用于蓝图使用、复制和委托(delegate)。

然而,一些委托(delegate)类型似乎不允许绑定(bind) UFUNCTION(如多播委托(delegate)),而其他类型需要绑定(bind) UFUNCTION(如动态多播委托(delegate))。

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

最佳答案

仅限 dynamic delegates要求可以绑定(bind)为 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增加编译时间和工件大小,因此仅在调用代码需要时使用宏。

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

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

接受 c++ 函数绑定(bind)的委托(delegate),可以用模板包装

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

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

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

离题:UFUNCTION 的其他用法

unreal answers 上的简短摘要.

关于delegates - 何时为委托(delegate)使用 UFUNCTION,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53417144/

相关文章:

c++ - 如何让玩家相机管理器的相机连接到角色的 Spring 臂上?

c# - 如何使在 wpf 窗口中运行的应用程序忽略单击或鼠标事件

batch-file - 如何使用批处理文件从虚幻引擎 .uproject 文件生成 Visual Studio 项目文件?

ios - 为 indexPath 获取 didSelectItemAt 上的值并将其添加到委托(delegate)/协议(protocol)以填充标题单元格

ios - 点击按钮时 UIAlertView 崩溃

c# - 虚拟事件处理程序会导致任何问题吗

c++ - UE4中如何将FText转为float

c# - Delegate.CreateDelegate() 和泛型 : Error binding to target method

c# - 当 C# 中的变量值发生变化时,如何执行代码?

c++ - 使用虚幻引擎 4 和 Visual Studio 团队服务