CreateWeakLambda() ---> weak object C++ lambda delegate ---> TWeakBaseFunctorDelegateInstance<...>::Create(...) CreateRaw() ---> C++ 原始成员函数委托 ---> TBaseRawMethodDelegateInstance<...>::Create(...) CreateSP() ---> 基于共享指针的成员函数委托 ---> TBaseSPMethodDelegateInstance...
注意BindLambda绑定的Lambda表达式捕获的外部变量,如果在触发委托的时候捕获的引用被销毁,那么会导致报错; BindWeakLambda、BindUObject、BindUFunction绑定时会弱引用一个UObject对象,需要预先IsBound()或者ExecuteIfBound来判断是否该对象还有效再执行委托,否则可能会报错; BindSP、BindThreadSafeSP绑定时会弱引用一个智能指...
CharacterDelegate6.BindWeakLambda(UObj1, WeakLambdaDelegateProc);//等价于CharacterDelegate6 = FCharacterDelegate::CreateWeakLambda(UObj1, WeakLambdaDelegateProc);UDelegatepTestClass* UObj2 = NewObject<UDelegatepTestClass>(this, UDelegatepTestClass::StaticClass()); CharacterDelegate7.BindWeakLambda(/...
CreateStatic() TBaseStaticDelegateInstance<...>::Create(...) CreateLambda() TBaseFunctorDelegateInstance<...>::Create(...) CreateWeakLambda() TWeakBaseFunctorDelegateInstance<...>::Create(...) CreateRaw() TBaseRawMethodDelegateInstance<...>::Create(...) CreateSP() TBaseSPMethodDelegateInsta...
CreateUObject先创建一个TBaseDelegate类实例(Result)用来存放结果,使用TBaseUObjectMethodDelegateInstance内的Create方法,修改Result的数据,最终返回Result。 关于TBaseUObjectMethodDelegateInstance,在TBaseDelegate类内创建函数(Create~)和绑定函数(Bind~)的上方,有关于TBaseUObjectMethodDelegateInstance一系列子类的代码(源码...
注意BindLambda绑定的Lambda表达式捕获的外部变量,如果在触发委托的时候会导致报错; BindWeakLambda、BindUObject、BindUFunction绑定时会弱引用一个UObject对象,需要预先IsBound()或者ExecuteIfBound来判断是否该对象还有效再执行委托,否则可能会报错; BindSP、BindThreadSafeSP绑定时会弱引用一个智能指针对象(UE4的智能指针...
这种情况下如果把从TSharedFromThis获取到的智能指针作为lambda的upvalue而不是this本身,即使外部的TSharedPtr在加载期间释放了,lambda内部还留有一个TSharedPtr,这样引用计数至少为1,在回调回来时对象肯定依然存活,这样就能正确运行了。UE4委托提供了CreateSP静态函数,方便快速创建带智能指针的Delegate,可以直接把AsShared...
something error")); pTransInScene->OnStartTransInNative.AddLambda([pSceneEvent]() { auto pOtherSceneWidget = Cast<UMyOtherSceneWidget>>(pSceneEvent->GetTransInSceneWidget()); pOtherSceneWidget->Setup(false); }); pTransInScene->OnTopToBackNative.AddLambda([this]() { auto pOwningPlayer = ...
TSharedPtr, TWeakPtr and TUniquePtr imitated from shared_ptr, weak_ptr and unique_ptr of C++11.
注意BindLambda绑定的Lambda表达式捕获的外部变量,如果在触发委托的时候会导致报错; BindWeakLambda、BindUObject、BindUFunction绑定时会弱引用一个UObject对象,需要预先IsBound()或者ExecuteIfBound来判断是否该对象还有效再执行...