본문 바로가기

게임프로그래밍/실습1

[언리얼 실습] 65. 에너미 어택 몽타주 재생하기


목차

  1. 몽타주 재생하기

1. 몽타주 재생하기

 

에너미의 공격을 구현하기 위해서 몽타주를 재생해보려고 한다.

 

에너미의 헤더파일로 들어가자.

 

virtual void Attack() override;
virtual void PlayAttackMontage() override;

 

Attack()함수와 이 Attack() 함수에서 실행할 PlayAttackMontage() 함수를 선언한다. 이제 이 두 함수를 정의하자.

 

Attack() 함수의 경우 추후 기능을 만들겠지만 지금은 단순히 공격 몽타주를 재생하는 역할만 한다.

void AEnemy::Attack()
{
	Super::Attack();
	PlayAttackMontage();
}

 

 

PlayAttackMontage() 함수는 플레이어 캐릭터에 있는 내용 그대로 복사해 붙여 놓았다.

void AEnemy::PlayAttackMontage()
{
	Super::PlayAttackMontage();

	UAnimInstance* AnimInstace = GetMesh()->GetAnimInstance();
	if (AnimInstace && AttackMontage)
	{
		AnimInstace->Montage_Play(AttackMontage);

		const int32 SectionCount = AttackMontage->GetNumSections();
		const int32 Selection = FMath::RandRange(0, SectionCount - 1);
		const FName SectionName = AttackMontage->GetSectionName(Selection);
		AnimInstace->Montage_JumpToSection(SectionName, AttackMontage);
	}
}

 

 

이제 이것을 실행시키자.

 

CheckCombatTarget() 함수 내에서 전투 범위 안에 있는지 없는지를 확인하고 있었다.

 

void AEnemy::CheckCombatTarget()
{
	// 생략
    }
	else if (InTargetRange(CombatTarget, AttackRadius) && EnemyState != EEnemyState::EES_Attacking)
	{
		// 공격 사거리 안, 플레이어를 공격
		EnemyState = EEnemyState::EES_Attacking;
		// TODO : AttackMontage 재생
		UE_LOG(LogTemp, Warning, TEXT("Attack"));
	}
}

 

단순히 여기서 Attack() 함수를 실행시키면 공격을 하긴 하겠지만 오로지 한번밖에 안 할 것이다. 또한 공격 몽타주 재생중 범위 밖으로 나갔다 들어오면 다시 함수가 실행되는 문제가 생길 수도 있다. (공격 사거리의 경우 굉장히 짧기 때문에 이런일이 자주 일어날 수 있다.)

 

이대로 컴파일하고 확인한 결과 단순히 이 문제가 끝이 아니라 공격 중 이동도 하고 공격시 캐릭터 방향과 상관없이 공격을 시행하는 등의 문제가 있었다. 이러한 것들은 차차 고치도록 하자.