一.遇到不得不用 广播的时候,以前当然也用过,用完就忘。但这次实战,发现确实好用,在特殊情况下,来加强记忆和经验,并不深入原理,重实战。
第一种情形,你的UI需要完成某种,信息通信后的响应。但你网络输入段,到你的widget。中间隔着无数个类,还跨模块。包含容易形成环形引用,这个时候就用动态多播。这里我使用在C++声明了动态多播事件,实现广播调用。响应事件是在蓝图里实现的。
1.声明一个动态多播委托
DECLARE_DYNAMIC_MULTICAST_DELEGATE(FNoramlEvent);
在 声明动态 单播/多播 委托(DECLARE_DYNAMIC_DELEGATE/DECLARE_DYNAMIC_MULTICAST_DELEGATE)时,DelegateName 参数必须以字符 'F' 开头,否则编译无法通过。
最好时声明所有委托时,DelegateName 参数都以字符 'F' 开头,这样就没有问题了
2.定义委托
UPROPERTY(BlueprintAssignable)
FNoramlEvent NormalEvent;
因为要在蓝图里实现委托,所以要加UPROPERTY(BlueprintAssignable);
在Widget的逻辑里实现,广播后的UI响应逻辑。
二.一个参数的传递回调 也类似
1.声明委托 再定义委托
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FMoveToQueryRowEvent, int32, MoveIndex);
UPROPERTY(BlueprintAssignable)
FMoveToQueryRowEvent MoveToQueryRowEvent;
2.委托
void UQueryRowWidget::MoveToQury()
{
UDrawLineSubsystem* TPASystem = GetWorld()->GetGameInstance()->GetSubsystem<UDrawLineSubsystem>();
if (!TPASystem) return;
if (TPASystem->isRecalling == true)
{
MoveToQueryRowEvent.Broadcast(MoveIndex);
}
}
3.绑定
BindDynamic( UserObject, FuncName )
AddDynamic( UserObject, FuncName )
RemoveDynamic( UserObject, FuncName )
解绑单个Clear
全部解绑
动态多播也支持使用Remove和Removeall,用法与多播一样
但这里并没有用到 多播的,多处响应的特点。
我在项目中也是使用的蓝图绑定的,多传了个参数值。