Подробно о делегатах UE
Есть 2 основных вида делегатов:
Dynamic - они используют сереализаю (сохронение в файл\загрузку). Они нужны для булпринтов. Для этого и нужна сиреализация, чтобы загружать булпринт. Для этого и нужно указывать UFUNCTION() Non dynamic - все что не исопльзуют динамик. У них свой класс. могут быть мульткаст и нет. Использовать можно в обычных коде, даже там где не UObject -ы
Dynamic - все является WeakPtr типа, т.е они безопасны и вызовутся только если обьект с котором они асоциированны (this) будет валиден.
Non dynamic бывают 4 видов:
Raw - они принимают this в виде обычной ссылке, без какой либо проверки и защиты. Работает с чем угодно, полезно для сеард парт библиотек Weak - используются
TWeakObjectPtr - могут работать только UObject, хранят в себя ссылку на обьект и проверяет его перед использованием. Бывает 3 видов:
UObject - сохроняет ссылку на зыс обьект и имя функции) WeakLambda - сохроняет ссылку на лябду, но если лямда вызывает функции, то тоже нужна this которую тоже нужно обезопасить)
UFunction - берет ссылку на зас и имя (текстом) функции и берет ее сигнатуру, полезно когда она протектед )
SP - шеред поинтер. Хранит обьект от гарбедж колектора, пока существуют шеред поинтеры. Работает и не с UObject ами, но по факту бесмыслена, если обьект должен был быть уже удален,а мы будем его хранить чтобы вызвать лямбду
Static -вызывает просто статическую или глобальную функцию.
Теперь про манипуляции:
Add - используется в мультикаст делегатов. Их же много, вот мы и добавляем.
Create - используется в не-мультикаст делегатах. Если мы берем просто класс делеката FDelegate::Create - то можем создать экземпляр делегата, через который будем потом вызывать Unbind и все такое Bind - используется в не-мультикаст делегатах.
Если у нас уже есть экземпляр делегата MyDelegate.Bind - то к нему мы уже добавляем чо хотим и через него же потом вызываем что хотим.
Last updated