传送
-
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 ↩︎