UE5.3 C++ 动态多播实战总结

发布于:2025-08-13 ⋅ 阅读:(20) ⋅ 点赞:(0)

一.遇到不得不用 广播的时候,以前当然也用过,用完就忘。但这次实战,发现确实好用,在特殊情况下,来加强记忆和经验,并不深入原理,重实战。

第一种情形,你的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,用法与多播一样

但这里并没有用到 多播的,多处响应的特点。

我在项目中也是使用的蓝图绑定的,多传了个参数值。


网站公告

今日签到

点亮在社区的每一天
去签到