목차
- 오버레이 초기화 하기
- 체력바 업데이트 하기
- 함수 수정 준비
1. 오버레이 초기화 하기
현재 오버레이를 사용하고 있고 이곳에서 체력과 스테미나 골드, 소울을 보여주고 있다. 이 값들을 초기화 하는 법을 알아보자.
오버레이에서 사용하고 있는 변수들은 캐릭터와 관련된 변수들이고 그렇기에 캐릭터 클래스에서 접근할 것이다.
캐릭터 클래스의 BeginPlay 함수로 들어가자.
APlayerController* PlayerController = Cast<APlayerController>(GetController());
if (PlayerController)
{
ASlashHUD* SlashHUD = Cast<ASlashHUD>(PlayerController->GetHUD());
}
다음과 같이 하면 HUD 클래스를 가져올 수 있다.
SlashHUD 에는 오버레이 변수가 있는데 이것을 가져올 방법이 현재는 없다.
// ASlashHUD.h
FORCEINLINE USlashOverlay* GetSlashOverlay() const { return SlashOverlay; }
Getter를 만들자.
다시 캐릭터 클래스로 들어가 이것을 가져올 수 있다. 물론 헤더파일들도 다 추가해야한다.
APlayerController* PlayerController = Cast<APlayerController>(GetController());
if (PlayerController)
{
ASlashHUD* SlashHUD = Cast<ASlashHUD>(PlayerController->GetHUD());
if (SlashHUD)
{
USlashOverlay* SlashOverlay = SlashHUD->GetSlashOverlay();
}
}
이제 이렇게 오버레이까지 가져올 수 있다.
그리고 오버레이에는 변수들을 설정할 수 있는 Setter가 있다.
APlayerController* PlayerController = Cast<APlayerController>(GetController());
if (PlayerController)
{
ASlashHUD* SlashHUD = Cast<ASlashHUD>(PlayerController->GetHUD());
if (SlashHUD)
{
USlashOverlay* SlashOverlay = SlashHUD->GetSlashOverlay();
if (SlashOverlay && Attributes)
{
SlashOverlay->SetHealthBarPercent(Attributes->GetHealthPercent());
SlashOverlay->SetStaminaBarPercent(1.f);
SlashOverlay->SetGold(0);
SlashOverlay->SetSouls(0);
}
}
}
이렇게 해서 초기값을 설정해주었다. 스테미나, 골드, 소울 등은 현재 값을 가지고 올 수 있는 어트리뷰트 클래스에 함수가 존재하지 않아 일단은 하드코딩을 해준다.
값들이 정상적으로 초기화 된 것을 볼 수 있다.
이제 다시 비주얼 스튜디오로 돌아간뒤 SlashOverlay 변수만 멤버변수로 바꿔주고 끝내자.
2. 체력바 업데이트 하기
이제 오버레이(위젯)에도 접근할 수 있으니 상태바, 그중에서 체력바를 업데이트하자. 나머지 항목들은 아직 제대로 구현이 되어있지 않아 체력바 먼저 할 것이다.
현재 플레이어는 TakeDamage() 함수에서 피격을 담당하고 있다.
float AKnight::TakeDamage(매개변수 생략)
{
HandleDamage(DamageAmount);
if (SlashOverlay && Attributes)
{
SlashOverlay->SetHealthBarPercent(Attributes->GetHealthPercent());
}
return DamageAmount;
}
이렇게 하면 피격 될 때마다 오버레이를 업데이트 할 수 있을 것이다.
3. 함수 수정 준비
이제 오버레이와는 관계없지만 게임 로직에서 중요한 부분을 수정할 것이다.
void AKnight::GetHit_Implementation(const FVector& ImpactPoint, AActor* Hitter)
{
Super::GetHit_Implementation(ImpactPoint, Hitter);
SetWeaponCollisionEnabled(ECollisionEnabled::NoCollision);
ActionState = EActionState::EAS_HitReaction;
}
void ABaseCharacter::GetHit_Implementation(const FVector& ImpactPoint, AActor* Hitter)
{
if (IsAlive() && Hitter) DirectionalHitReact(Hitter->GetActorLocation());
else Die();
PlayHitSound(ImpactPoint);
SpawnHitParticles(ImpactPoint);
}
현재 Hit 함수가 이렇게 설정되어있다. (아래쪽은 부모 위쪽은 자식)
이렇게 하면 현재 플레이어가 데스 몽타주가 없고 따라서 그 어떤 몽타주도 재생되지 않아 노티파이가 실행되지 않고 영원히 HitReaction 상태로 유지된다는 것이다.
따라서 플레이어가 죽었다면 상태를 바꿔주고 더 이상 히트가 되지 않게 콜리전도 없애줄 것이다.
그것은 다음에 이어서 해보겠다.
'게임프로그래밍 > 실습1' 카테고리의 다른 글
[언리얼 실습] 79. 픽업 인터페이스 & 소울 픽업 효과 (0) | 2024.11.13 |
---|---|
[언리얼] 77. 플레이어 데스 몽타주 재생하기 (0) | 2024.11.13 |
[언리얼 실습] 75. HUD 세팅 (0) | 2024.11.12 |
[언리얼 실습] 74. 오버레이 위젯 만들기 (0) | 2024.11.12 |
[언리얼 실습] 73. 플레이어가 피해를 입게 하기 (0) | 2024.11.12 |