Когда использовать UFUNCTION для делегатов - PullRequest
0 голосов
/ 21 ноября 2018

В UnrealEngine UFUNCTION используется для обогащения функций дополнительными спецификаторами для использования чертежей, репликации и делегатов.

Однако некоторые типы делегатов не позволяют связыватьUFUNCTION (как многоадресный делегат), в то время как другие типы требуют привязки UFUNCTION (как динамический многоадресный делегат).

Имеется ли обзор, какой тип делегата принимает какой тип функции (нормальный с ++ или UFUNCTION)?

1 Ответ

0 голосов
/ 23 ноября 2018

Только динамический делегаты требуют, чтобы функции, которые могут быть ограничены, составляли 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

Краткое резюме на нереальные ответы .

...