六一的部落格


关关难过关关过,前路漫漫亦灿灿。



使用委托实现颜色信息同步输出

C++和蓝图均订阅委托


GeometryObject作为服务端

颜色随机变化时, 通知客户端


定义委托类型

  1. C++和蓝图均可作为客户端, 支持多客户端

    蓝图可订阅时, 需提供形参名称: 给出的变量名不是字符串,但在蓝图编辑器中确实作为参数名
  2. 回调函数接受两个参数, 颜色信息和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作为传入参数

  1. 整合Color和Name到一个字符串 Append

    自动添加节点将FLinearColor转换成String
  2. 输出字符串 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}

日志



材质颜色随机变化时, 输出颜色信息


使用委托实现颜色信息同步输出

C++和蓝图均订阅委托


GeometryObject作为服务端

颜色随机变化时, 通知客户端


定义委托类型

  1. C++和蓝图均可作为客户端, 支持多客户端

    蓝图可订阅时, 需提供形参名称: 给出的变量名不是字符串,但在蓝图编辑器中确实作为参数名
  2. 回调函数接受两个参数, 颜色信息和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作为传入参数

  1. 整合Color和Name到一个字符串 Append

    自动添加节点将FLinearColor转换成String
  2. 输出字符串 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}

日志