【UE4 塔防游戏系列】08-敌人到达终点对玩家造成伤害
发布人:shili8
发布时间:2025-01-06 12:28
阅读次数:0
**UE4 塔防游戏系列08 - 敌人到达终点对玩家造成伤害**
在前面的文章中,我们已经实现了基本的塔防游戏逻辑,包括敌人的移动、攻击等功能。但是,在这个系列的最后一篇文章中,我们将重点介绍如何让敌人到达终点后对玩家造成伤害。
**1. 敌人到达终点的检测**
首先,我们需要检测敌人是否已经到达了终点。我们可以使用UE4提供的`OverlapComponent`功能来实现这一点。在这个例子中,我们将使用一个球形的碰撞体(Collision Sphere)作为终点。
cpp// 在 EnemyActor 中添加一个 Collision Sphere 组件UCLASS()
class MyGame : public AActor{
GENERATED_BODY()
public:
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Enemy")
class USphereComponent* EndPoint;
// ...
};
// 在 EnemyActor 的构造函数中初始化终点碰撞体EndPoint = CreateDefaultSubobject(TEXT("EndPoint"));
EndPoint->SetSphereRadius(100.0f);
EndPoint->SetCollisionProfileName("OverlapAll");
**2. 检测敌人到达终点**
接下来,我们需要在玩家角色上添加一个事件处理器来检测敌人是否已经到达了终点。我们可以使用UE4提供的`OnComponentBeginOverlap`事件。
cpp// 在 PlayerCharacter 中添加一个 Collision Sphere 组件UCLASS()
class MyGame : public APlayerCharacter{
GENERATED_BODY()
public:
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Player")
class USphereComponent* PlayerEndPoint;
// ...
};
// 在 PlayerCharacter 的构造函数中初始化终点碰撞体PlayerEndPoint = CreateDefaultSubobject(TEXT("PlayerEndPoint"));
PlayerEndPoint->SetSphereRadius(100.0f);
PlayerEndPoint->SetCollisionProfileName("OverlapAll");
// 在 PlayerCharacter 中添加一个事件处理器来检测敌人到达终点void AMyGame::BeginPlay()
{
Super::BeginPlay();
// ...
}
void AMyGame::OnComponentBeginOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComponent, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult)
{
if (OtherActor != nullptr && OtherActor->IsA(AEnemyActor::StaticClass()))
{
// 敌人到达终点 OnEnemyReachEndPoint();
}
}
void AMyGame::OnEnemyReachEndPoint()
{
// 对玩家造成伤害 TakeDamage(100.0f);
}
**3. 对玩家造成伤害**
最后,我们需要实现对玩家造成伤害的逻辑。在这个例子中,我们将使用UE4提供的`TakeDamage`函数来实现这一点。
cppvoid AMyGame::TakeDamage(float Damage)
{
// 计算玩家的当前生命值 float CurrentHealth = GetHealth();
// 计算玩家受到的伤害量 float DamageTaken = FMath::Min(Damage, CurrentHealth);
// 更新玩家的生命值 SetHealth(CurrentHealth - DamageTaken);
}
通过以上这些步骤,我们就实现了敌人到达终点对玩家造成伤害的逻辑。

