최종 프로젝트 - 기술적 의사결정 (호러크리처 Flee 상태 추가)

정혜창·2025년 6월 28일

내일배움캠프

목록 보기
63/64
post-thumbnail

📌 의사결정 이유

기존에 단순히 ‘먹는 공격’만 으로 기획되었던 호러크리처(HorrorCreature) AI 패턴을 더 다양하고 예측 불가능하게 만들고 싶었음.

같은 ‘먹는’ 컨셉의 몬스터로 이미 Limadon이라는 적이 존재했기 때문에, 행동 차별화와 게임플레이의 깊이를 추가하기 위해

Flee(도주) 상태를 새롭게 설계·도입.

호러크리처는 플레이어를 삼킨 후, 일정 거리만큼 도망가다가 안전하다고 판단되면 삼킨 대상을 뱉어내고

다시 빠르게 도주(Flee)하는 특별한 행동 패턴을 구현.

  • 단조로운 반복 공격 대신 상황별 패턴 변화
  • 플레이어와 몬스터 간의 심리전, 전략적 상호작용
  • 몬스터마다 각기 다른 행동 아이덴티티를 실현.

📌 해결 방안

1️⃣ HorrorCreature 특화 Custom BTTask_HorrorCreatureAttack 추가

HorrorCreature의 전체 BehaviorTree

  • HorrorCreature의 상태에 따라 BT가 분기되는 것을 볼 수 있다.

HorrorCreature의 Combat Task

  • Chase 상태가 되면 TargetActor를 향해 MoveTo
  • MoveTo가 Succeed 하면 HorrorCreatureAttack Task로 넘어간다.
  • Parallel Task로 MoveTo를 한 것은 삼키는 것이다 보니깐 공격할 때 Player 쪽으로 다가가야 하기 때문

2️⃣ 먹고 뱉을 때 상태 전환

void AHorrorCreature::SwallowPlayer(AUnderwaterCharacter* Victim)
{
	.
	.
	.

	SetMonsterState(EMonsterState::Flee);
	BlackboardComponent->ClearValue(TargetActorKey);
}

void AHorrorCreature::EjectPlayer(AUnderwaterCharacter* Victim)
{
	.
	.
	.
	FTimerHandle SetPatrolTimeHandle;
	GetWorld()->GetTimerManager().SetTimer(
		SetPatrolTimeHandle,
		this,
		&AHorrorCreature::SetPatrolStateAfterEject,
		FleeTime,
		false
	);
}
  • 먹고 (Swallow) 뱉는 (Eject) 행동의 핵심 로직
    • 먹고 나면 SetMonsterState(EMonsterState::Flee)로 전환.
    • 뱉고 나면 FleeTime 이후 SetPatrolStateAfterEject() 를 통해 다시 Patrol로 전환.

  • EQS 를 통해 도망갈 지점을 동적으로 찾고 (Fallback Task로 Navmesh 위 Random위치 (FindRandomLocation)) 이동
  • SimpleParallel 의 Delay 설정으로 서브 Task인 EjectVictim 가 끝날 때 Task가 성공하도록 설정
  • 뱉고 나면 다시 EQS로 도망갈 지점을 동적으로 다시 찾고 MoveTo 하도록 설계

📌 효과

  • 다양한 몬스터의 행동으로 인해 게임플레이 몰입감, 긴장감 증가

  • 동일 컨셉 몬스터 간의 개성 부여, 차별화

  • 추후 패턴·상태 추가 확장성 및 코드 재사용성 향상

    👉 Flee 상태 도입으로 플레이어의 몰입감과 게임의 긴장감을 한층 강화했고, AI 패턴의 확장성과 차별화된 심해 호러 경험을 실현

profile
Unreal 1기

0개의 댓글