首先,UE4中的delegate和C#里边是一样的,delegate的本质是一个特殊类的对象,它可以储存(一个或多个)函数指针和payload数据(就是除了函数指针,还能存些你调用时候的额外参数)UE4中的delegate类名字中都有signature,这里我们以overlap的回调委托为例:在各种mesh components中,都有这么一个字段
FComponentBeginOverlapSignature OnComponentBeginOverlap;
其中FComponentBeginOverlapSignature这个类就是一个delegate,在这里,他还是一个broadcast delegate,我们看看他的实现
DECLARE_DYNAMIC_MULTICAST_DELEGATE_FiveParams( FComponentBeginOverlapSignature,class AActor*, OtherActor, class UPrimitiveComponent*, OtherComp, int32, OtherBodyIndex, bool, bFromSweep, const FHitResult &, SweepResult);
很显然,这个类的声明使用了UE4的一个宏定义,这个宏是一个系列,是专门用来声明delegate的,毕竟我们不可能自己声明一个delegate类,这太困难。但是使用这个宏,我们可以很方便的声明委托类。首先宏本体有很多种,看例子很好理解
DECLARE_DELEGATE( DelegateName )
声明一个叫DelegateName的类,他是一个返回void的没有参数的委托
DECLARE_DELEGATE_TwoParams( DelegateName, Param1Type, Param2Type )
返回void的名