UE4中如何阻止AZombieBasic通过ApplyDamage伤害同类型或自身Actor
问题解决方案
核心问题原因
- 原有逻辑缺少自身、同类僵尸的排除判断
- 仅通过
OtherActor == mainCharacter做判断存在漏洞:如果mainCharacter指针未初始化/赋值失败,判断永远不生效,没有伤害输出;如果原有全局伤害代码未删除,会跳过你的判断直接执行,导致所有Actor都受伤害 - 未做类型安全校验,无法过滤非玩家、非僵尸的其他Actor
修复后的实现代码
void AZombieBasic::DamageOnOverlap(AActor* HitActor, AActor* OtherActor) { // 1. 排除自身伤害 if (OtherActor == this) { return; } // 2. 排除同类僵尸互相伤害 if (Cast<AZombieBasic>(OtherActor) != nullptr) { return; } // 3. 校验目标是玩家且指针有效,再执行伤害 AMainCharacter* HitPlayer = Cast<AMainCharacter>(OtherActor); if (HitPlayer != nullptr && mainCharacter != nullptr && HitPlayer == mainCharacter) { UGameplayStatics::ApplyDamage(OtherActor, 20.f, GetWorld()->GetFirstPlayerController(), this, UDamageType::StaticClass()); } }
额外注意事项
- 确保
mainCharacter指针在BeginPlay阶段完成赋值,示例赋值逻辑:
void AZombieBasic::BeginPlay() { Super::BeginPlay(); mainCharacter = Cast<AMainCharacter>(UGameplayStatics::GetPlayerCharacter(GetWorld(), 0)); }
- 确认重叠事件的绑定逻辑正确,没有重复绑定多份伤害回调
- 如果需要支持伤害其他非玩家、非僵尸的Actor,可以在排除前两层校验后自定义对应逻辑
内容的提问来源于stack exchange,提问作者George_H
相关产品推荐
相关产品推荐

