使用蓝图(Blueprint)绑定多播委托(Multicast Delegate)【UE4】【C++】
发布日期:2021-07-01 05:53:53 浏览次数:2 分类:技术文章

本文共 2955 字,大约阅读时间需要 9 分钟。

 

本例将讲解 如何在 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 parameterDECLARE_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 valuesAKing::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
(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 spawnedvoid AKing::BeginPlay(){ Super::BeginPlay(); }// Called every framevoid 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
(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
 

编辑蓝图类:

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

 

编辑关卡蓝图

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

 

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

 

 

 

 

 

 

 

 

 

转载地址:https://panda1234lee.blog.csdn.net/article/details/64133298 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:诗意的世界
下一篇:事件处理(Handling Events)和委托(Delegate)代码示例(三)【UE4】【C++】

发表评论

最新留言

逛到本站,mark一下
[***.202.152.39]2024年05月01日 10时37分20秒