목차
- 공격 상태로 바꾸기
1. 공격 상태로 바꾸기
이제 추격(Chasing)을 하다가 거리가 더욱 가까워저 공격 사거리 안으로 들어오면 공격 상태로 바꿔보려고 한다. 이때 공격 기능의 경우는 나중에 좀 더 있다가 추가할 것이다.
가장 먼저 공격 사거리를 정해야할 것이다. 에너미 헤더파일로 들어가자.
UPROPERTY(EditAnywhere)
double AttackRadius = 150.f;
공격 사거리를 알았으니 이미 존재하는 CheckCombatTarget() 함수에서 캐릭터와의 거리마다 에너미가 할 행동을 지정해주자.
void AEnemy::CheckCombatTarget()
{
if (!InTargetRange(CombatTarget, CombatRadius))
{
CombatTarget = nullptr;
if (HealthBarWidget)
{
HealthBarWidget->SetVisibility(false);
}
EnemyState = EEnemyState::EES_Patrolling;
GetCharacterMovement()->MaxWalkSpeed = 125.f;
MoveToTarget(PatrolTarget);
}
else if (!InTargetRange(CombatTarget, AttackRadius) && EnemyState != EEnemyState::EES_Chasing)
{
// 공격 사거리 밖, 플레이어를 추적
EnemyState = EEnemyState::EES_Chasing;
GetCharacterMovement()->MaxWalkSpeed = 300.f;
MoveToTarget(CombatTarget);
}
else if (InTargetRange(CombatTarget, AttackRadius) && EnemyState != EEnemyState::EES_Attacking)
{
// 공격 사거리 안, 플레이어를 공격
EnemyState = EEnemyState::EES_Attacking;
// TODO : AttackMontage 재생
}
}
이렇게 해서 상태들을 바꾸었다. 이렇게 하니 문제점이 있다. 공격사거리 안에서 에너미가 캐릭터를 바라보면 PawnSeen이라는 콜백함수가 호출되어 에너미 상태가 Chasing으로 바뀌고 바로 다시 Combat 상태로 바뀌는 과정을 계속 반복한다.
이것은 분명히 좋지 못하다. 그렇기 때문에 이 부분을 막아주어야 한다.
void AEnemy::PawnSeen(APawn* SeenPawn)
{
if (EnemyState == EEnemyState::EES_Chasing) return;
if (SeenPawn->ActorHasTag(FName("KnightCharacter")))
{
GetWorldTimerManager().ClearTimer(PatrolTimer);
GetCharacterMovement()->MaxWalkSpeed = 300.f;
CombatTarget = SeenPawn;
if (EnemyState != EEnemyState::EES_Attacking)
{
EnemyState = EEnemyState::EES_Chasing;
MoveToTarget(CombatTarget);
UE_LOG(LogTemp, Warning, TEXT("Pawn Seen"));
}
}
}
에너미가 공격중이 아닐때만 Chasing 상태로 들어가게 바꿔주었다.
이제 다음에는 에너미가 공격을 받으면 캐릭터를 추적하게 바꿀 것이다.
'게임프로그래밍 > 실습1' 카테고리의 다른 글
[언리얼 실습] 63. 자식 에너미 클래스 만들기 (0) | 2024.11.06 |
---|---|
[언리얼 실습] 62. 에너미가 타격을 받으면 플레이어를 추격하기 (0) | 2024.11.06 |
[언리얼 실습] 60. 에너미의 순찰, 추격, 공격 상태 구분하기 (0) | 2024.11.05 |
[언리얼 실습] 59. 에너미가 플레이어 발견시 반응하기 (0) | 2024.11.05 |
[언리얼 실습] 58. 패트롤 대기 시간 추가하기 (0) | 2024.11.05 |