使用蓝图(Blueprint)绑定多播委托(Multicast Delegate)【UE4】【C++】

简介: 使用蓝图(Blueprint)绑定多播委托(Multicast Delegate)【UE4】【C++】

本例将讲解 如何在 C++ 中创建一个多播委托,然后在运行时通知一组的 Actors(即广播事件给监听事件的对象们)

 

首先创建一个 继承自 StaticMeshActor 的类,命名为 King

 

King.h

// the type name of new delegate signature being created
// the type of the signature's parameter
// the name of the signature's parameter
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnKingDeathSignature, AKing*, DeadKing);  // 委托签名;OnKingDeath.Broadcast 和 Peasant::flee(函数指针) 的参数类型;Peasant::flee 参数名
UCLASS()
class TEST_API AKing : public AStaticMeshActor
{
  GENERATED_BODY()
public: 
  // Sets default values for this actor's properties
  AKing();
  // Called when the game starts or when spawned
  virtual void BeginPlay() override;
  // Called every frame
  virtual void Tick( float DeltaSeconds ) override;
  UFUNCTION(BlueprintCallable, Category = King)
  void Die();// 在关卡蓝图中调用,广播委托
  UPROPERTY(BlueprintAssignable)  //  蓝图可以动态地为委托赋予事件
  FOnKingDeathSignature OnKingDeath;// 多播委托实例,在Broadcast之后调用该委托上的方法
};

注意动态多播委托的定义格式

King.cpp

// Sets default values
AKing::AKing()
{
  // Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.
  PrimaryActorTick.bCanEverTick = true;
  auto MeshAsset = ConstructorHelpers::FObjectFinder<UStaticMesh>(TEXT("StaticMesh'/Engine/BasicShapes/Cone.Cone'"));
  if (MeshAsset.Object != nullptr)
  {
    GetStaticMeshComponent()->SetStaticMesh(MeshAsset.Object);
    GetStaticMeshComponent()->bGenerateOverlapEvents = true;
  }
  GetStaticMeshComponent()->SetMobility(EComponentMobility::Movable);
}
// Called when the game starts or when spawned
void AKing::BeginPlay()
{
  Super::BeginPlay();
}
// Called every frame
void AKing::Tick( float DeltaTime )
{
  Super::Tick( DeltaTime );
}
void AKing::Die()
{
  OnKingDeath.Broadcast(this);
}

接着,我们再新建一个类——Peasant,同样也是继承自 StaticMeshActor

 

Peasant.h

UCLASS()
class TEST_API APeasant : public AStaticMeshActor
{
  GENERATED_BODY()
public:
  APeasant();
  UFUNCTION(BlueprintCallable, category = Peasant)
  void Flee(AKing* DeadKing); // 自定义事件所绑定的函数
};

在蓝图中,我们会给委托实例 OnKingDeath 绑定自定义事件(Custom Event),自定义事件绑定着 Peasant 类的 Flee 函数

 

Peasant.cpp

APeasant::APeasant()
{
  auto MeshAsset = ConstructorHelpers::FObjectFinder<UStaticMesh>(TEXT("StaticMesh'/Engine/BasicShapes/Cube.Cube'"));
  if (MeshAsset.Object != nullptr)
  {
    GetStaticMeshComponent()->SetStaticMesh(MeshAsset.Object);
    GetStaticMeshComponent()->bGenerateOverlapEvents = true;
  }
  GetStaticMeshComponent()->SetMobility(EComponentMobility::Movable);
}
// 委托上绑定的函数参数为 King 的指针,所以 Broadcast 以该指针为参数
void APeasant::Flee(AKing* DeadKing)
{
  GEngine->AddOnScreenDebugMessage(-1, 2, FColor::Red, TEXT("Waily Waily!"));
  FVector FleeVector = GetActorLocation() - DeadKing->GetActorLocation();
  FleeVector.Normalize();
  FleeVector *= 500;
  SetActorLocation(GetActorLocation() + FleeVector);
}

这里有一个地方要特别注意,由于 Flee 传进来的是一个 King 的指针,所以需要确保调用它的时候 King 指针仍然是有效的,即不能提前调用 King 的 Destroy 方法。


然后,我们基于Peasant 类,创建一个 蓝图,命名为 BPPeasant

编辑蓝图类:


image.png

image.png

然后,我们就可以将 King 类 和若干 BPPeasant 实例拖动到场景中

 

编辑关卡蓝图

设定一个延时,来广播委托事件(Die 函数)


image.png

最后,我们就可以看到这样一个效果——在5秒之后, King 周围的 Peasant 都同时“远离” King。

目录
相关文章
|
4月前
|
C++
【C++】bind绑定包装器全解(代码演示,例题演示)
【C++】bind绑定包装器全解(代码演示,例题演示)
|
12月前
|
程序员 C++ Windows
Windows C++ 启动子进程并绑定子进程,主进程结束关闭后自动结束关闭子进程
在Windows平台上主进程启动子进程,并使主进程结束关闭后自动结束关闭子进程
159 0
|
3月前
|
安全 JavaScript 前端开发
C++一分钟之-C++17特性:结构化绑定
【6月更文挑战第26天】C++17引入了结构化绑定,简化了从聚合类型如`std::tuple`、`std::array`和自定义结构体中解构数据。它允许直接将复合数据类型的元素绑定到单独变量,提高代码可读性。例如,可以从`std::tuple`中直接解构并绑定到变量,无需`std::get`。结构化绑定适用于处理`std::tuple`、`std::pair`,自定义结构体,甚至在范围for循环中解构容器元素。注意,绑定顺序必须与元素顺序匹配,考虑是否使用`const`和`&`,以及谨慎处理匿名类型。通过实例展示了如何解构嵌套结构体和元组,结构化绑定提升了代码的简洁性和效率。
61 5
|
4月前
|
存储 安全 C语言
C++|多态性与虚函数(1)功能绑定|向上转换类型|虚函数
C++|多态性与虚函数(1)功能绑定|向上转换类型|虚函数
|
4月前
|
编译器 程序员 C++
【C++ 17 新特性 结构化绑定】深入理解C++ 17 结构化绑定[key, value] 的处理
【C++ 17 新特性 结构化绑定】深入理解C++ 17 结构化绑定[key, value] 的处理
139 1
|
4月前
|
设计模式 机器学习/深度学习 算法
C++设计模式新篇章:掌握状态委托
C++设计模式新篇章:掌握状态委托
107 0
|
4月前
|
Rust 算法 编译器
【C/C++ 基础知识 】C++中的静态绑定与动态绑定:深入解析与比较
【C/C++ 基础知识 】C++中的静态绑定与动态绑定:深入解析与比较
157 0
|
4月前
C++11实用技术(二)std::function和bind绑定器
C++11实用技术(二)std::function和bind绑定器
54 0
|
存储 算法 安全
4.6 C++ Boost 函数绑定回调库
Boost库中提供了函数对象库,可以轻松地把函数的参数和返回值进行绑定,并用于回调函数。这个库的核心就是bind函数和function类。 bind函数可以将一个函数或函数对象和其参数进行绑定,返回一个新的函数对象。通过这个新的函数对象,我们就可以将原有的函数或函数对象当做参数传来传去,并可以传递附加的参数,方便实现参数绑定和回调函数。function类用于表示一种特定的函数签名,可以在不知道具体函数的类型时进行类型擦除,并把这个函数作为参数传递和存储。通过function类,我们可以在编译时确定函数的类型,而在运行时将不同类型的函数封装成统一的类型,这为实现回调函数提供了便利。
103 0
|
C++
C++绑定器和函数对象
band1st和band2nd本身还是一个函数对象。
87 0