본문 바로가기
Games/UE4

UE4) C++코드로 간단한 State machine 구현해보기

by NCTP 2022. 5. 30.

 

먼저 TickStateMachine 함수를 만든다. (activeState는 AEnemy 클래스의 상태를 저장하는 Enum 클래스임.)

이 함수는 Tick()함수에서 매 프레임 실행되는 함수로, 각 상태마다 switch문을 통해 구별해서 함수를 실행함.

void AEnemy::TickStateMachine(float deltaTime)
{
	switch (activeState)
	{
	case State::IDLE:
		StateIdle();
		break;
	case State::CLOSE:
		StateClose();
		break;
	case State::FAR:
		StateFar();
		break;
	case State::MELEE_ATTACK_01:
		StateMeleeAttack01();
		break;
	case State::MELEE_ATTACK_02:
		StateMeleeAttack02(deltaTime);
		break;
	case State::RANGE_ATTACK_01:
		StateRangeAttack01();
		break;
	case State::RANGE_ATTACK_02:
		StateRangeAttack02();
		break;
	case State::AREA_ATTACK_01:
		StateAreaAttack01();
		break;
	case State::AREA_ATTACK_02:
		StateAreaAttack02();
		break;
	case State::GIMMICK:
		StateGimmick();
		break;
	case State::DEAD:
		StateDead();
		break;
	}

}

그 다음은 상태를 바꿔주는 함수를 구현한다.

void AEnemy::SetState(State newState)
{
	if (activeState != State::DEAD)
		activeState = newState;
}

TickStateMachine 에서 각 상태별로 각 상태에 맞는 함수를 Call 했는데,

이 함수들을 구현해주면 된다. 다음은 Idle상태에서 Call 되는 함수. 플레이어와 가까우면 Close 상태로, 플레어어로부터 멀면 Far 상태로 전환한다.

void AEnemy::StateIdle()
{
	UE_LOG(LogTemp, Warning, TEXT("IDLE"));
	if (player && FVector::Distance(player->GetActorLocation(), GetActorLocation()) <= 1500.0f)
	{
		SetState(State::CLOSE);
	}
	else if (player && FVector::Distance(player->GetActorLocation(), GetActorLocation()) > 1500.0f)
	{
		SetState(State::FAR);
	}

}

이렇게 자신이 원하는 코드를 구현해서 코드를 통해 적의 AI를 통제할 수 있다. 물론 언리얼엔진 자체에서도 지원하기 때문에 Blackboard와 Behavior tree를 사용하는 방법도 있다. 

댓글