언리얼4 보스/캐릭터 히트박스 데미지 전달
Intro
- 몬스터와 캐릭터의 히트박스 데미지 전달
무기 콜리전 추가

무기 소켓을 부모로하는 캡슐컬리전을 생성하여 몬스터와 충돌했는지 체크할 수 있도록 한다.
콜리전 노티파이 추가

캡슐 콜리전을 켜고 끌수있도록 공격시 OnCollision 공격 중단시 OnCollisionEnd 노티파이를 추가한다.
AnimInstance
void URaidPlayerAnimInstance::AnimNotify_OnCollision()
{
Player->OnCollStart();
}
void URaidPlayerAnimInstance::AnimNotify_OnCollisionEnd()
{
Player->OnCollEnd();
}
애니메이션 인스턴스에서 각 노티파이를 통해 플레이어 클래스에 있는 콜리전 활성화 함수를 실행하도록한다.
콜리전 활성화 함수
void ARaidPlayer::OnCollStart() // 노티파이 발생시 공격 컬리전 체크
{
AttackCheck->SetCollisionEnabled(ECollisionEnabled::QueryAndPhysics);
}
void ARaidPlayer::OnCollEnd()
{
AttackCheck->SetCollisionEnabled(ECollisionEnabled::NoCollision);
}
콜리전 오버랩 체크
AttackCheck->OnComponentBeginOverlap.AddDynamic(this, &ARaidPlayer::AttackCheckOverlap);
콜리전이 활성화되어 오버랩 이벤트가 발생한다면 AttackCheckOverlap 함수를 실행하도록 바인드한다.
AttackCheckOverlap 함수
void ARaidPlayer::AttackCheckOverlap(UPrimitiveComponent* OverlappedComp, AActor * OtherActor, UPrimitiveComponent * OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult & SweepResult)
{
FVector OverlapLocation = OverlappedComp->GetComponentLocation();
FTransform OverlapTransform = OtherActor->GetActorTransform();
if (OtherActor != this)
{
ServerApplyDamage(OtherActor, Damage, this);
UGameplayStatics::PlaySoundAtLocation(this, HitSound, OverlapLocation);
UGameplayStatics::PlaySoundAtLocation(this, HitSound2, OverlapLocation);
UGameplayStatics::SpawnEmitterAtLocation(GetWorld(), PlayerHitEffect, OverlapTransform, true);
}
}
AttackCheckOverlap 함수에서는 ApplyDamage와 함께 타격 사운드, 이펙트를 재생하도록한다.
데미지 피격
TakeDamage
float ARaidPlayer::TakeDamage(float Damage, FDamageEvent const & DamageEvent, AController * EventInstigator, AActor * DamageCauser)
{
const float ActualDamage = Super::TakeDamage(Damage, DamageEvent, EventInstigator, DamageCauser);
if (ActualDamage > 0.f)
{
PlayerHP -= ActualDamage;
if (!IsHit && !IsAttacking && !IsDodge)
{
PlayerAnim->PlayHitMontage();
IsHit = true;
bCanBeDamaged = false;
}
if (PlayerHP <= 0.f)
{
GameMode->PlayerDead.Broadcast();
PlayerDeath();
}
}
캐릭터가 데미지를 입게된다면 피격 모션을 재생시키고 bCanBeDamaged를 false상태로 만들어 잠시 무적으로 만든다.
HP가 0이하로 내려가면 PlayerDeath함수를 실행하고 관련 UI를 생성하기 위해 게임모드에서 PlayerDead를 BroadCast한다.
몬스터 데미지 전달

몬스터도 마찬가지로 무기 콜리전을 추가하고 같은 방식으로 플레이어에게 데미지를 주도록 구성한다.
실행 결과

댓글남기기