1. 데미지 이벤트(FDamageEvent)
액터가 발생시키는 데미지의 형태를 가리키는 구조체이다.
UE 5.1 이상부터는 헤더에 다음을 포함해야 한다.
#include "Engine/DamageEvents.h"
(1) FPointDamageEvent - 점 데미지 이벤트
탄환과 같이 한 점에 맞는 데미지 종류.
(2) FRadialDamageEvent - 방사형 데미지 이벤트
수류탄, 폭발과 같이 구형으로 퍼져나가는 데미지 종류.
2. 데미지 입히기
// 라인트레이스
FHitResult Hit;
bool bSuccess = GetWorld()->LineTraceSingleByChannel(Hit, Location, End, ECollisionChannel::ECC_GameTraceChannel1);
if(bSuccess)
{
// 총알이 날아오는 방향
FVector ShotDirection = -Rotation.Vector();
UGameplayStatics::SpawnEmitterAtLocation(GetWorld(), HitFlash, Hit.Location, ShotDirection.Rotation());
if (Hit.GetActor())
{
FPointDamageEvent DamageEvent(Damage, Hit, ShotDirection, nullptr);
Hit.GetActor()->TakeDamage(Damage, DamageEvent, OwnerController, this);
}
}
이전 포스트의 라인 트레이스 코드 이후에 코드를 추가한다.
(1) DamageEvent
- 총에서 발생한 라인 트레이스가 발생시키는 데미지 이벤트는 FPointDamageEvent(점 데미지 이벤트)이다.
FPointDamageEvent는 피해량, FHitResult 구조체(Hit 정보가 담긴 구조체), 발사 방향 벡터, 데미지 타입 클래스(UDamageType)의 4가지 인수를 받는 생성자로 오버로딩 할 수 있다.
- 발사 방향은 탄환이 발사되어 온 방향이다(탄환의 발사 방향의 반대 방향)
(2) FHitResult 사용
- FHitResult로 선언된 Hit 구조체에는 라인 트레이스에 의해 발생한 타격 판정에 대한 정보들이 담겨져 있다.
- Hit 구조체는 맞은 액터를 기준으로 한다.
(3) AActor::TakeDamage
- TakeDamage 함수는 피해량, 데미지 이벤트, 데미지와 연관된 컨트롤러, 데미지 발생자(원인)의 4개의 인수를 가진다.
3. 데미지 받기
(1) 최대 체력, 체력 개념 도입 - ShooterCharacter.h
UPROPERTY(EditDefaultsOnly)
float MaxHealth = 100.f;
UPROPERTY(VisibleAnywhere)
float Health;
최대 체력 값은 사양에 따라 변경할 수 있도록 EditDefaultsOnly로 지정한다(모든 인스턴스가 동일한 값을 가짐).
체력 값은 외부에서 변경할 수 없지만 확인할 수 있도록 VisibleAnywhere로 지정한다.
void AShooterCharacter::BeginPlay()
{
Super::BeginPlay();
Health = MaxHealth;
이후 BeginPlay에서 체력을 최대 체력으로 초기화한다.
(2) TakeDamage 함수 오버로딩
public:
// Called every frame
virtual void Tick(float DeltaTime) override;
virtual float TakeDamage(float DamageAmount, FDamageEvent const& DamageEvent, AController* EventInstigator, AActor* DamageCauser) override;
float AShooterCharacter::TakeDamage(float DamageAmount, FDamageEvent const& DamageEvent, AController* EventInstigator, AActor* DamageCauser)
{
float DamageApplied = Super::TakeDamage(DamageAmount, DamageEvent, EventInstigator, DamageCauser);
DamageApplied = FMath::Min(Health, DamageApplied);
Health -= DamageApplied;
UE_LOG(LogTemp, Display, TEXT("Your message %f"), Health);
return DamageApplied;
}
새롭게 도입한 체력에 받은 데미지를 계산하도록 TakeDamage 함수를 오버로딩한다.
헬스 컴포넌트를 사용하지 않고 액터 내에 이런 방법을 사용하여 데미지를 입도록 구현할 수도 있다.
'UE 5 스터디 > C++' 카테고리의 다른 글
8. 비헤이비어 트리와 블랙 보드 (0) | 2024.03.07 |
---|---|
7. AI에 길 찾기 알고리즘 적용(NavMesh, MoveTo) (0) | 2024.03.07 |
5. 라인 트레이스(LineTraceSingleByChannel) (0) | 2024.03.06 |
4. 이펙트 스포닝하기(SpawnEmitterAttached) (0) | 2024.03.06 |
3. 액터를 다른 액터에 붙이기(AttachToComponent) (0) | 2024.03.06 |