Только динамический делегаты требуют, чтобы функции, которые могут быть ограничены, составляли 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
увеличивает время компиляции и размер артефакта, поэтомуИспользуйте макрос только тогда, когда этого требует вызывающий код.
Динамические делегаты поддерживают сериализацию, имеют дополнительный код для работы в графах Blueprint (называемый Event / Event Dispatcher в BP) и работают медленнее, чем другие типы делегатов.Если вам нужны только делегаты для C ++, вам не нужны динамические в большинстве случаев.
Поддержка шаблонов C ++ для не динамических делегатов
Делегаты, которые принимают связывание функций c ++, могут быть упакованыпо шаблону
template<typename T>
struct MyTemplateWrapper
{
DECLARE_MULTICAST_DELEGATE_OneParam(FMyDelegateWithTemplate, T);
};
Используйте его как MyTemplateWrapper<float>::FMyDelegateWithTemplate MyCallback;
.
Имейте в виду: макрос UPROPERTY
не поддерживается для MyCallback
, поскольку MyTemplateWrapper
не может бытьUSTRUCT
/ UCLASS
(поскольку они не поддерживают шаблоны).Однако, поскольку динамические типы делегатов не не поддерживают чертежи, пропущенный UPROPERTY
не является потерей.
Не по теме: дополнительное использование UFUNCTION
Краткое резюме на нереальные ответы .