언리얼4 보스 Behavior Tree 범위 패턴
Intro
- 몬스터 범위 패턴 추가
패턴 개요
일정 범위안에 데미지를 주도록 하는 패턴 구현
비헤이비어 트리 추가
애니메이션 노티파이 추가
RadialDamage
노티파이 호출
AnimInstance
void UGruxAnimInstance::AnimNotify_RadialDamage()
{
Grux->RadialDamage();
}
몬스터 액터
void AGrux::RadialDamage()
{
ServerApplyRadialDamage(Damage*2.0, 1000);
}
데미지와 범위 파라메터를 전달 해준다.
void AGrux::ServerApplyRadialDamage_Implementation(float RDamage,float Radius)
{
UGameplayStatics::ApplyRadialDamage(GetWorld(), RDamage, this->GetActorLocation(), Radius, nullptr, TArray<AActor*>(), this, false, ECC_GameTraceChannel5);
GruxLeftCheck->SetCollisionEnabled(ECollisionEnabled::NoCollision);
GruxRightCheck->SetCollisionEnabled(ECollisionEnabled::NoCollision);
FVector Center = this->GetActorLocation();
UWorld* World = GetWorld();
TArray<FOverlapResult> OverlapResults;
FCollisionQueryParams CollisionQueryParam(NAME_None, false, this);
bool bResult = World->OverlapMultiByChannel(
OverlapResults,
Center,
FQuat::Identity,
ECollisionChannel::ECC_GameTraceChannel5,
FCollisionShape::MakeSphere(Radius),
CollisionQueryParam
);
if (bResult)
{
for (auto OverlapResult : OverlapResults)
{
ARaidPlayer* Player = Cast<ARaidPlayer>(OverlapResult.GetActor());
if (Player != nullptr)
{
CHECK(Player != nullptr);
FVector PlayerLocation = Player->GetActorLocation();
FTransform PlayerTransform = Player->GetActorTransform();
if (!Player->IsDodge)
{
UGameplayStatics::PlaySoundAtLocation(this, GruxGroundHit, PlayerLocation);
UGameplayStatics::SpawnEmitterAtLocation(GetWorld(), GruxFireEffect, PlayerTransform, true);
}
}
}
}
}
데미지 전달과 함께 범위내에 플레이어가 있으면 피격사운드와 파티클을 재생시키도록 했다.
if문을 통해 플레이어의 상태가 구르기 상태(무적)가 아닐때만 발생시키도록함
댓글남기기