材质颜色随机变化时, 输出颜色信息
2024年1月7日 2024年1月18日
使用委托实现颜色信息同步输出
C++和蓝图均订阅委托
GeometryObject作为服务端
颜色随机变化时, 通知客户端
定义委托类型
- C++和蓝图均可作为客户端, 支持多客户端
蓝图可订阅时, 需提供形参名称: 给出的变量名不是字符串,但在蓝图编辑器中确实作为参数名 - 回调函数接受两个参数, 颜色信息和Actor名称
使用DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams
1DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FOnColorChange, const FLinearColor&, Color, const FString&, Name);
定义委托类型数据成员
- | |
---|---|
OnColorChange | 材质颜色变化时通知客户端 |
GeometryObject
public
1FOnColorChange OnColorChange;
材质颜色变化时通知客户端
1// OnTimerRandomColor 2OnColorChange.Broadcast(Color, GetName());
至此,委托服务端的部署全部完成
客户端: 蓝图订阅
客户端订阅 | |
---|---|
C++ | 在BeginPlay中注册委托 |
蓝图 | BeginPlay事件发生时注册委托 |
在蓝图类中注册委托
BP_Geometry_Sphere
BeginPlay之后, 对OnColorChanged进行赋值,即订阅委托服务
实现处理操作
收到通知时,从OnColorChange_Event出发; Color和Name作为传入参数
- 整合Color和Name到一个字符串
Append
自动添加节点将FLinearColor转换成String - 输出字符串 PrintString
输出
GeometryHub作为客户端: C++订阅
添加函数成员: 委托处理函数
private
打印Actor描述和颜色描述
因为该委托可用于蓝图,虽然不会在蓝图中使用OnColorChange,仍需使用UFUNCTION宏标记
- 不需使用声明符
- 与引擎内存模型有关
添加数据成员: Actor派生类类型
protected
需在虚幻编辑器中设置
1UPROPERTY(EditAnywhere) 2TSubclassOf<AGeometryObject> GeometryClassForColorChange;
添加函数成员: 创建Actor对象, 注册委托
private
在BeginPlay中调用
1void AGeometryHub::SpawnGeometryForColorChange() 2{ 3 UWorld* World = GetWorld(); 4 if (World) 5 { 6 const FTransform Transform = 7 FTransform(FRotator::ZeroRotator, FVector(300.0f, 400.0f, 800.0f)); 8 AGeometryObject* Geometry = World->SpawnActorDeferred<AGeometryObject>(GeometryClassForColorChange, Transform); 9 Geometry->OnColorChange.AddDynamic(this, &AGeometryHub::OnColorChange); 10 FGeometrySetting GeometrySetting = Geometry->GetGeometrySetting(); 11 GeometrySetting.FlagRandomColor = true; 12 GeometrySetting.MoveType = FMath::RandBool() ? EGeometryMoveType::Rotate : EGeometryMoveType::Sin; 13 Geometry->SetGeometrySetting(GeometrySetting); 14 Geometry->FinishSpawning(Transform); 15 } 16}
日志