对游戏角色造成伤害
2023年6月11日 2024年1月11日
概览
C++
对游戏角色造成伤害
- 虚幻引擎提供一组函数,用来对Actor造成伤害
- 若有注册伤害处理服务, Actor受到伤害时触发处理函数
- 本节在Tick函数中持续对游戏角色造成伤害
伤害处理服务
- 我们在Actor提供的数据成员处注册伤害处理函数, 在处理函数中减少游戏角色生命值
持续对游戏角色造成伤害
C++
伤害来源是自己
ShootThemUp: Player/STUBaseCharacter.cpp
1// Tick 2TakeDamage(0.1f, FDamageEvent{}, GetController(), this);
伤害处理服务
- AActor定义了委托类型FTakeAnyDamageSignature,并有该类型数据成员AActor::OnTakeAnyDamage
- 我们通过数据成员注册伤害处理服务
- 处理函数签名
1void handler(AActor* DamagedActor, float Damage, const class UDamageType* DamageType, class AController* InstigatedBy, AActor* DamageCauser);
- 该委托类型支持蓝图
- 触发伤害处理函数时,会传入UDamageType
注册伤害机制的委托服务
C++
搭建框架
- 添加空函数
ShootThemUp: Components/STUHealthComponent.cpp
1void USTUHealthComponent::OnTakeAnyDamage(AActor* DamagedActor, float Damage, const class UDamageType* DamageType, class AController* InstigatedBy, AActor* DamageCauser) {}
- 注册伤害处理函数
ShootThemUp: Components/STUHealthComponent.cpp
1#include "GameFramework/Actor.h" 2 3// BeginPlay 4AActor *TheOwner = GetOwner(); 5if (TheOwner) 6{ 7 TheOwner->OnTakeAnyDamage.AddDynamic(this, &USTUHealthComponent::OnTakeAnyDamage); 8}
- 添加函数声明
private
ShootThemUp: Components/STUHealthComponent.h
1UFUNCTION() 2void OnTakeAnyDamage(AActor* DamagedActor, float Damage, const class UDamageType* DamageType, class AController* InstigatedBy, AActor* DamageCauser);
实现处理函数
ShootThemUp: Components/STUHealthComponent.cpp
1// OnTakeAnyDamage 2Health -= Damage;
差不多一秒10帧,即1s调用十次处理函数;Health减为0之后,继续减少