[Unreal] Boss FSM

Cassis_Soda·2025년 2월 11일

2차 프로젝트

목록 보기
3/10

※ 해당 기록은 Unreal 5.5.3 버전을 기준으로 작성되었습니다.


0. 서론

    팀원과 소스트리로 파일을 주고받는 과정에서 이전에 엔진 버전 업데이트를 했던 팀원이 있어서 강제로 버전업을 당했다. 이번에 보스 AI를 수업에서 배운 FSM을 이용해서 구현했다.

1. 구조

FSM
   구조는 간단하다. Idle에서 Move로 이동하고 Move에서 공격 사거리 안에 들어오면 공격하고 다시 Move로 전이된다. 이 세 상태 중 어떤 상태에서도 Hit와 Die로 전이될 수 있는데, Hit에서 TakeDamage처리를 하고, 일정 체력 퍼센트에 도달할 때마다 Phase Change로 전이된다.

2. 코드

//h에서
void State_Idle();

void State_Move();

void State_Attack();

void State_Hit();

void State_PhaseChange();

void State_Die();

FORCEINLINE float GetDeltaTime() { return GetWorld()->DeltaTimeSeconds; }

    먼저 6가지 상태에 대해 정의했다. FSM을 액터 컴포넌트 부모로하여 만들었기 때문에 Tick대신 TickComponent로 돌아간다. DeltaTime으로 델타타임을 받아올 수가 없어서 여러 번 사용할 게 될 GetWorld()->DelataTimeSeconds를 그냥 인라인 함수로 구현했다.

switch (state)
{
	case EBossState::Idle:			{ State_Idle(); }			break;
	case EBossState::Move:			{ State_Move(); }			break;
	case EBossState::Attack:		{ State_Attack(); }			break;
	case EBossState::Hit:			{ State_Hit(); }			break;
	case EBossState::PhaseChange:	{ State_PhaseChange(); }	break;
	case EBossState::Die:			{ State_Die(); }			break;
}

    Switch문으로 구현했다. 그래프로 구현하는 방법도 있다고 들었지만, 이번 프로젝트 기간안에는 완성할 수 없을 것 같다는 조언으로 포기했다.

void UBossFSM::State_PhaseChange()
{
	me->GetCapsuleComponent()->SetCollisionEnabled(ECollisionEnabled::NoCollision);

	nowTime += GetDeltaTime();

	if (nowTime > PhaseChangeTime)
	{
		me->GetCapsuleComponent()->SetCollisionEnabled(ECollisionEnabled::QueryAndPhysics);
		nowTime = 0.f;
		state = EBossState::Idle;
	}
}

    각 함수의 내부는 이런 식으로 구현이 되어있다. 각 State에서 해야할 행동들을 구현하고, 다음 상태로 전이되는 조건을 걸어주어 조건에 맞게 전이될 수 있게 했다.

3. 앞으로 할 일

     이제 각 상태에 맞는 애니메이션을 붙여주고, State_Attack에서 각 패턴에 맞게 어떤 공격을 실행할지, 이런 것들을 더 자세히 구현할 필요가 있다.

0개의 댓글