언리얼4 보스/캐릭터 히트박스 데미지 전달

Intro

  • 몬스터와 캐릭터의 히트박스 데미지 전달

무기 콜리전 추가

1

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

콜리전 노티파이 추가

2

캡슐 콜리전을 켜고 끌수있도록 공격시 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();
		}
	}

캐릭터가 데미지를 입게된다면 피격 모션을 재생시키고 bCanBeDamagedfalse상태로 만들어 잠시 무적으로 만든다.

HP가 0이하로 내려가면 PlayerDeath함수를 실행하고 관련 UI를 생성하기 위해 게임모드에서 PlayerDeadBroadCast한다.

몬스터 데미지 전달

3

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

실행 결과

gif

참고 자료

댓글남기기