使用蓝图(Blueprint)绑定多播委托(Multicast Delegate)【UE4】【C++】
在蓝图中,我们会给委托实例 OnKingDeath 绑定自定义事件(Custom Event),自定义事件绑定着 Peasant 类的 Flee 函数 然后,我们基于Peasant 类,创建一个 蓝图,命名为 BPPeasant
发布日期: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接着,我们再新建一个类——Peasant,同样也是继承自 StaticMeshActor(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.h
UCLASS()class TEST_API APeasant : public AStaticMeshActor{ GENERATED_BODY()public: APeasant(); UFUNCTION(BlueprintCallable, category = Peasant) void Flee(AKing* DeadKing); // 自定义事件所绑定的函数};
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 方法。
编辑蓝图类:
然后,我们就可以将 King 类 和若干 BPPeasant 实例拖动到场景中
编辑关卡蓝图
设定一个延时,来广播委托事件(Die 函数)
最后,我们就可以看到这样一个效果——在5秒之后, King 周围的 Peasant 都同时“远离” King。
转载地址:https://panda1234lee.blog.csdn.net/article/details/64133298 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
逛到本站,mark一下
[***.202.152.39]2024年05月01日 10时37分20秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Unity中HideInInspector和SerializeField
2019-05-04
unity3d回调函数总结学习
2019-05-04
C#回调函数,事件
2019-05-04
有限状态机(FSM)的设计与实现(二)
2019-05-04
Unity3D手游开发实践《腾讯桌球》客户端开发经验总结
2019-05-04
Unity3D游戏开发之“预加载场景,瞬间过图”
2019-05-04
Unity3D游戏开发之“重写Unity Android Splash,实现启动无黑屏”
2019-05-04
Unity3D游戏开发之“txt配档文件的读取”
2019-05-04
Unity3D的坑系列:动态加载dll
2019-05-04
Unity代码热更新解决方案测试结果总结
2019-05-04
如何将Unity中的脚本文件转为dll文件
2019-05-04
动态替换模型的shader
2019-05-04
判断是否有敌人的3种方法
2019-05-04
二十四种设计模式、七大原则
2019-05-04
[Unity3D]关于Assets资源目录结构管理
2019-05-04
行为树(Behavior Tree)
2019-05-04
unity常用插件
2019-05-04
行为树的理解和学习
2019-05-04
三分钟了解LOD在游戏里面的运用
2019-05-04
链表倒置
2019-05-04