언리얼4 C++ 몬스터 행동 패턴 추가하기

Intro

  • 보스 몬스터 행동패턴 추가와 랜덤 실행

새로운 공격 추가

몽타주 추가

static ConstructorHelpers::FObjectFinder<UAnimMontage> ATTACK_MONTAGE2(TEXT("공격 몽타주2"));
	if (ATTACK_MONTAGE2.Succeeded())
	{
		AttackMontage2 = ATTACK_MONTAGE2.Object;
	}

static ConstructorHelpers::FObjectFinder<UAnimMontage> ATTACK_MONTAGE3(TEXT("공격 몽타주3'"));
	if (ATTACK_MONTAGE3.Succeeded())
	{
		AttackMontage3 = ATTACK_MONTAGE3.Object;
	}

몽타주 실행 함수 추가

void UBossZombieAnimInstance::PlayAttackMontage2()
{
	Montage_Play(AttackMontage2, 1.0f);
}

void UBossZombieAnimInstance::PlayAttackMontage3()
{
	Montage_Play(AttackMontage3, 1.0f);
}

AnimNotify 추가

void UBossZombieAnimInstance::AnimNotify_AttackHitCheck2()
{
	OnAttackHitCheck2.Broadcast();
}

void UBossZombieAnimInstance::AnimNotify_AttackHitCheck3()
{
	OnAttackHitCheck3.Broadcast();
}

각 공격에 맞는 AttackCheck 함수가 실행되도록 바인딩 해준다.

ZombieAnim->OnAttackHitCheck2.AddUObject(this, &ABossZombie::AttackCheck2);
ZombieAnim->OnAttackHitCheck3.AddUObject(this, &ABossZombie::AttackCheck3);

각 공격의 AttackCheck 추가

패턴2

void ABossZombie::AttackCheck2()
{
	FHitResult HitResult;

	FCollisionQueryParams Params;
	Params.AddIgnoredActor(this);
	bool bResult = GetWorld()->SweepSingleByChannel(
		HitResult,
		GetActorLocation(),
		GetActorLocation() + GetActorForwardVector() * 180.0f,
		FQuat::Identity,
		ECollisionChannel::ECC_GameTraceChannel5,
		FCollisionShape::MakeSphere(180.0f),
		Params);
        
    if (bResult)
	{
		if (HitResult.GetActor()->ActorHasTag("Player"))
		{
			FDamageEvent DamageEvent;
			// 데미지전달
			HitResult.Actor->TakeDamage(50, DamageEvent, GetController(), this);

		}
	}
}

패턴3

void ABossZombie::AttackCheck3()
{
    
    Attack3_Particle(); // 파티클 토글
 
	FHitResult HitResult;

	FCollisionQueryParams Params;
	Params.AddIgnoredActor(this);
	bool bResult = GetWorld()->SweepSingleByChannel(
		HitResult,
		GetActorLocation(),
		GetActorLocation() + GetActorForwardVector() * 280.0f,
		FQuat::Identity,
		ECollisionChannel::ECC_GameTraceChannel5,
		FCollisionShape::MakeSphere(280.0f),
		Params);
        
    if (bResult)
	{
		if (HitResult.GetActor()->ActorHasTag("Player"))
		{
			FDamageEvent DamageEvent;
			// 데미지전달
			HitResult.Actor->TakeDamage(80, DamageEvent, GetController(), this);

		}
	}
}

각 공격마다 데미지와 공격범위를 수정해주었고 AttackCheck3는 추가로 파티클을 발생시키도록 했다.

1

Task 추가

2

기존에 있던 태스크에서 실행하는 애니메이션값만 수정하여 2개의 추가 Task를 만들었다.

비헤이비어 트리 수정

블랙보드 키 값 추가

4

int형 키 값 TaskNumber 추가

서비스 추가

5

키 값을 랜덤으로 발생 시키도록 하는 서비스 추가

6

변수 SelectNumber의 유형은 Blackboard Key로 해주었다.

7

Selector에 서비스를 부착시키고 Select Number를 TaskNumber로 교체해준다음 Call Tick on Search Start에 체크하여 검색 시작시 틱 이벤트를 호출하도록 했다.

테스크 추가

3

8

만들어둔 공격 테스크를 각각 추가시킨다음 블랙보드의 TaskNumber 값에 따라 테스크를 선택하도록 하여 랜덤으로 행동하도록 했다.

실행결과

gif

공격 애니메이션이 랜덤으로 실행되고 범위와 데미지가 다르게 구현됨

댓글남기기