먼저 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를 사용하는 방법도 있다.
'Games > UE4' 카테고리의 다른 글
UE4) 언리얼 프로젝트를 깃허브로 공유할 때 주의할 점 (0) | 2022.08.03 |
---|---|
UE4) 느린 Intellisense 속도를 높이는 법 (0) | 2022.05.10 |
댓글