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

举报
ShaderJoy 发表于 2021/12/30 01:37:58 2021/12/30
【摘要】   本例将讲解 如何在 C++ 中创建一个多播委托,然后在运行时通知一组的 Actors(即广播事件给监听事件的对象们)   首先创建一个 继承自 StaticMeshActor 的类,命名为 King   King.h   // the type name of new ...

 

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

 

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

 

King.h

 


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

 

 

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

King.cpp


   
  1. // Sets default values
  2. AKing::AKing()
  3. {
  4. // Set this actor to call Tick() every frame. You can turn this off to improve performance if you don't need it.
  5. PrimaryActorTick.bCanEverTick = true;
  6. auto MeshAsset = ConstructorHelpers::FObjectFinder<UStaticMesh>(TEXT("StaticMesh'/Engine/BasicShapes/Cone.Cone'"));
  7. if (MeshAsset.Object != nullptr)
  8. {
  9. GetStaticMeshComponent()->SetStaticMesh(MeshAsset.Object);
  10. GetStaticMeshComponent()->bGenerateOverlapEvents = true;
  11. }
  12. GetStaticMeshComponent()->SetMobility(EComponentMobility::Movable);
  13. }
  14. // Called when the game starts or when spawned
  15. void AKing::BeginPlay()
  16. {
  17. Super::BeginPlay();
  18. }
  19. // Called every frame
  20. void AKing::Tick( float DeltaTime )
  21. {
  22. Super::Tick( DeltaTime );
  23. }
  24. void AKing::Die()
  25. {
  26. OnKingDeath.Broadcast(this);
  27. }

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

Peasant.h


   
  1. UCLASS()
  2. class TEST_API APeasant : public AStaticMeshActor
  3. {
  4. GENERATED_BODY()
  5. public:
  6. APeasant();
  7. UFUNCTION(BlueprintCallable, category = Peasant)
  8. void Flee(AKing* DeadKing); // 自定义事件所绑定的函数
  9. };
 
在蓝图中,我们会给委托实例 OnKingDeath 绑定自定义事件(Custom Event),自定义事件绑定着 Peasant 类的 Flee 函数
 

Peasant.cpp


   
  1. APeasant::APeasant()
  2. {
  3. auto MeshAsset = ConstructorHelpers::FObjectFinder<UStaticMesh>(TEXT("StaticMesh'/Engine/BasicShapes/Cube.Cube'"));
  4. if (MeshAsset.Object != nullptr)
  5. {
  6. GetStaticMeshComponent()->SetStaticMesh(MeshAsset.Object);
  7. GetStaticMeshComponent()->bGenerateOverlapEvents = true;
  8. }
  9. GetStaticMeshComponent()->SetMobility(EComponentMobility::Movable);
  10. }
  11. // 委托上绑定的函数参数为 King 的指针,所以 Broadcast 以该指针为参数
  12. void APeasant::Flee(AKing* DeadKing)
  13. {
  14. GEngine->AddOnScreenDebugMessage(-1, 2, FColor::Red, TEXT("Waily Waily!"));
  15. FVector FleeVector = GetActorLocation() - DeadKing->GetActorLocation();
  16. FleeVector.Normalize();
  17. FleeVector *= 500;
  18. SetActorLocation(GetActorLocation() + FleeVector);
  19. }
这里有一个地方要特别注意,由于 Flee 传进来的是一个 King 的指针,所以需要确保调用它的时候 King 指针仍然是有效的,即不能提前调用 King 的 Destroy 方法。
 

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

编辑蓝图类:

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

 

编辑关卡蓝图

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

 

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

 

 

 

 

 

 

 

 

 

文章来源: panda1234lee.blog.csdn.net,作者:panda1234lee,版权归原作者所有,如需转载,请联系作者。

原文链接:panda1234lee.blog.csdn.net/article/details/64133298

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。