본문 바로가기
프로그래밍

👨‍💻 [Unreal] 언리얼 엔진에서 유한 상태 기계 (FSM : Finite State Machine) 는 무엇이며, 어떻게 활용할 수 있나요?

by 밝음의기둥 2024. 11. 25.
반응형

👨‍💻 안녕하세요, 윌리 프로젝트의 윌리 입니다.

언리얼 엔진에서 유한 상태 기계 (FSM : Finite State Machine) 는 무엇이며, 어떻게 활용할 수 있는지 간략히 알아보았습니다.


질문 >

언리얼 엔진에서 유한 상태 기계 (FSM : Finite State Machine) 는 무엇이며, 어떻게 활용할 수 있나요?

답변 >

**유한 상태 기계(FSM, Finite State Machine)**는 미리 정의된 상태(State)들상태 전환(Transition) 규칙을 사용하여 객체의 행동을 제어하는 프로그래밍 패턴입니다. 언리얼 엔진에서 FSM은 주로 캐릭터의 상태(걷기, 뛰기, 점프 등)나 AI 행동(순찰, 추격, 공격 등)을 관리하기 위해 사용됩니다.

FSM의 주요 개념

  1. 상태(State):
    • 객체의 현재 상태를 나타냅니다. 예를 들어, 캐릭터의 상태는 Idle, Walking, Jumping 등이 될 수 있습니다.
  2. 상태 전환(Transition):
    • 특정 조건(이벤트, 입력 등)이 만족되면 현재 상태에서 다른 상태로 전환됩니다. 예를 들어, Idle 상태에서 이동 키 입력이 발생하면 Walking 상태로 전환될 수 있습니다.
  3. 상태 동작(Action):
    • 각 상태에서 실행되는 동작이나 로직입니다. 예를 들어, Jumping 상태에서는 캐릭터가 위로 이동하는 애니메이션과 물리 효과가 실행됩니다.

언리얼 엔진에서 FSM 활용 방법

1. C++를 사용한 FSM 구현

C++에서 FSM은 열거형(enum)과 상태 전환 로직을 통해 구현할 수 있습니다.

// 상태 열거형 정의
UENUM(BlueprintType)
enum class ECharacterState : uint8
{
    Idle UMETA(DisplayName = "Idle"),
    Walking UMETA(DisplayName = "Walking"),
    Jumping UMETA(DisplayName = "Jumping"),
};

// 상태 관리 클래스
class AMyCharacter : public ACharacter
{
protected:
    ECharacterState CurrentState;

    virtual void Tick(float DeltaTime) override;
    void HandleState();
    void TransitionToState(ECharacterState NewState);

public:
    AMyCharacter();
};

상태 전환과 상태별 로직은 Tick 함수나 이벤트 함수에서 처리합니다.

void AMyCharacter::Tick(float DeltaTime)
{
    Super::Tick(DeltaTime);
    HandleState();
}

void AMyCharacter::HandleState()
{
    switch (CurrentState)
    {
        case ECharacterState::Idle:
            // Idle 상태 로직
            break;

        case ECharacterState::Walking:
            // Walking 상태 로직
            break;

        case ECharacterState::Jumping:
            // Jumping 상태 로직
            break;
    }
}

void AMyCharacter::TransitionToState(ECharacterState NewState)
{
    if (CurrentState != NewState)
    {
        CurrentState = NewState;
        // 상태 전환 시 초기화 작업 수행 가능
    }
}


2. 블루프린트를 사용한 FSM 구현

블루프린트는 언리얼 엔진에서 FSM을 구현하기 위한 시각적 도구를 제공합니다. 블루프린트에서 FSM은 주로 상태 머신(State Machine) 노드를 활용하여 캐릭터 애니메이션이나 상태를 제어합니다.

  1. 애니메이션 블루프린트에서 상태 머신 사용:
    • 애니메이션 블루프린트에서 State Machine 노드를 추가하여 각 상태에 대한 애니메이션을 정의하고, 상태 전환 규칙(Transition Rule)을 설정합니다.
    • 예를 들어, Idle에서 Walking 상태로 전환하려면 "속도(Speed)가 0보다 크다"는 조건을 추가할 수 있습니다.
  2. FSM의 블루프린트 노드:
    • 이벤트 그래프에서 Switch on Enum 노드를 사용하여 열거형(enum) 상태에 따라 로직을 분기할 수 있습니다.
    • 상태 전환 로직은 이벤트나 입력(키보드, 마우스 등)을 기반으로 구현됩니다.

3. AI 행동에 FSM 적용

FSM은 언리얼 엔진의 Behavior Tree와 함께 AI 행동을 제어하는 데 유용하게 사용됩니다.

  • Behavior Tree:
    • FSM과 비슷한 구조로 AI의 행동 상태를 트리 형태로 관리합니다.
    • 상태 전환은 조건(데코레이터)과 태스크 노드를 사용하여 정의됩니다.
    • 예를 들어, AI가 Patrolling 상태에서 플레이어를 발견하면 Chasing 상태로 전환됩니다.
  • FSM을 Behavior Tree와 병합:
    • 특정 AI 행동을 FSM으로 관리하고, Behavior Tree를 통해 높은 수준의 의사결정을 처리합니다.

FSM 활용 예시

플레이어 캐릭터의 상태 관리

  • 상태: Idle, Walking, Running, Jumping
  • 전환 조건:
    • 이동 입력 발생: Idle → Walking
    • 점프 입력 발생: Walking → Jumping
    • 이동 입력 중지: Walking → Idle

AI 행동 상태 관리

  • 상태: Patrolling, Chasing, Attacking
  • 전환 조건:
    • 플레이어 발견: Patrolling → Chasing
    • 공격 범위 내 진입: Chasing → Attacking
    • 플레이어 상실: Chasing → Patrolling

FSM 활용 시 장점

  1. 코드의 가독성과 유지보수성 향상:
    • 상태와 전환 규칙을 명확히 정의하여 복잡한 행동 로직을 간결하게 관리할 수 있습니다.
  2. 확장성:
    • 새로운 상태나 전환 규칙을 추가하기 쉽습니다.
  3. 디버깅 용이:
    • 각 상태와 전환 규칙이 명확히 정의되어 디버깅과 문제 해결이 용이합니다.

요약

FSM은 캐릭터의 동작AI 행동을 상태 기반으로 관리하기 위한 강력한 패턴입니다. 언리얼 엔진에서는 C++ 코드와 블루프린트, 애니메이션 블루프린트, Behavior Tree 등을 사용해 FSM을 구현할 수 있습니다. 이를 통해 게임 로직을 효율적으로 관리하고, 확장 가능하며 안정적인 상태 전환을 설계할 수 있습니다.


"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."


🎬 유튜브 채널 🎬

 

위로그@WiLog

📢 안녕하세요, 위로그@WiLog 시청자 여러분, 저는 윌리 입니다. 📢 위로그@WiLog 는 자기주도학습을 목적으로 라이브 스트리밍을 합니다. 📢 1인 게임 개발을 목표로 Unreal과 Blender를 학습 중입니

www.youtube.com

🎬 치지직 채널 🎬

 

위로그 채널 - CHZZK

지금, 스트리밍이 시작됩니다. 치지직-

chzzk.naver.com


반응형