언리얼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
한다.
몬스터 데미지 전달
몬스터도 마찬가지로 무기 콜리전을 추가하고 같은 방식으로 플레이어에게 데미지를 주도록 구성한다.
댓글남기기