Подробно о делегатах UE

Есть 2 основных вида делегатов:

Dynamic - они используют сереализаю (сохронение в файл\загрузку). Они нужны для булпринтов. Для этого и нужна сиреализация, чтобы загружать булпринт. Для этого и нужно указывать UFUNCTION() Non dynamic - все что не исопльзуют динамик. У них свой класс. могут быть мульткаст и нет. Использовать можно в обычных коде, даже там где не UObject -ы

Dynamic - все является WeakPtr типа, т.е они безопасны и вызовутся только если обьект с котором они асоциированны (this) будет валиден.

Non dynamic бывают 4 видов:

  1. Raw - они принимают this в виде обычной ссылке, без какой либо проверки и защиты. Работает с чем угодно, полезно для сеард парт библиотек Weak - используются

  2. TWeakObjectPtr - могут работать только UObject, хранят в себя ссылку на обьект и проверяет его перед использованием. Бывает 3 видов:

    1. UObject - сохроняет ссылку на зыс обьект и имя функции) WeakLambda - сохроняет ссылку на лябду, но если лямда вызывает функции, то тоже нужна this которую тоже нужно обезопасить)

    2. UFunction - берет ссылку на зас и имя (текстом) функции и берет ее сигнатуру, полезно когда она протектед )

    3. SP - шеред поинтер. Хранит обьект от гарбедж колектора, пока существуют шеред поинтеры. Работает и не с UObject ами, но по факту бесмыслена, если обьект должен был быть уже удален,а мы будем его хранить чтобы вызвать лямбду

  3. Static -вызывает просто статическую или глобальную функцию.

Теперь про манипуляции:

  1. Add - используется в мультикаст делегатов. Их же много, вот мы и добавляем.

  2. Create - используется в не-мультикаст делегатах. Если мы берем просто класс делеката FDelegate::Create - то можем создать экземпляр делегата, через который будем потом вызывать Unbind и все такое Bind - используется в не-мультикаст делегатах.

  3. Если у нас уже есть экземпляр делегата MyDelegate.Bind - то к нему мы уже добавляем чо хотим и через него же потом вызываем что хотим.

Last updated