本文以吃豆人游戏为例UE4项目: 自制UE4 小游戏 (gitee.com)

传送
pawn
进入box
触发OnActorBeginOverlap
- 获取目标位置,下一帧将
pawn
坐标更改为目标位置

-
首先需要重叠函数与开始重叠事件绑定
OnActorBeginOverlap.AddDynamic(this, &ATeleporterActor::OnOverlapBegin);
-
头文件声明
UPROPERTY(EditAnywhere)ATeleporterActor* Target = nullptr; //目标位置,在蓝图中设置比较方便UPROPERTY(EditAnywhere)USoundCue* TeleportSound;//声音UFUNCTION()void OnOverlapBegin(AActor* TeleporterActor, AActor* OtherActor);//触发重叠后执行的操作
-
实现
void ATeleporterActor::TeleportToTarget(AActor * Actor) {//获取传送目标名为"Spawn"的场景组件USceneComponent* TargetSpawn = Cast<USceneComponent>(Target->GetDefaultSubobjectByName("Spawn"));UGameplayStatics::PlaySound2D(this, TeleportSound);Actor->SetActorLocation(TargetSpawn->GetComponentLocation());//更改坐标 }void ATeleporterActor::OnOverlapBegin(AActor * TeleporterActor, AActor * OtherActor) {if (OtherActor->ActorHasTag("Pacman")) {//下一帧,调用传送函数GetWorldTimerManager().SetTimerForNextTick([OtherActor, this]() { TeleportToTarget(OtherActor); });} }
Target->GetDefaultSubobjectByName
获取名为xxx的子对象,例如本游戏中就是获取ATeleporterActor
名为spawn
的子对象

条件加速
当吃豆人吃到特殊的豆子的时候就会加速,这使用了动态多播1主要目的是降低对象之间的耦合,代码更加清晰简洁
动态多播:观察者模式, 动态即支持蓝图序列化,即可在蓝图中绑定事件,但蓝图获取不到在C++中定义的动态多播的实例引用,即使用元数据 BlueprintReadWrite 标记也不行,但可以通过 【Assign 实例名称】 的蓝图节点为在C++中定义的动态多播对象绑定新的委托函数
- 将加速豆被吃操作绑定到豆被吃事件上
- 每次有豆被吃事件发生的时候,都会广播当前豆子的类型
- 普通豆被吃无反应
- 加速豆被吃就会执行加速豆被吃事件
-
注册动态多播
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FFoodieEatenEvent, EFoodieType, FoodieType);
-
绑定事件
忽略下面的error,不知道为什么,重新打开的时候就这样了,但还能正常运行…
-
广播豆子类型,当豆子被吃掉的时候
void AFoodie::Consume() {UGameplayStatics::PlaySound2D(this, ConsumptionSound);FoodieEatenEvent.Broadcast(FoodieType); // 广播类型Destroy(); }
https://mp.weixin.qq.com/s/Vliuv3jfUWU_1VvWSBx70w ↩︎