👨💻 안녕하세요, 윌리 프로젝트의 윌리 입니다.
언리얼 엔진에서 유한 상태 기계 (FSM : Finite State Machine) 는 무엇이며, 어떻게 활용할 수 있는지 간략히 알아보았습니다.
질문 >
언리얼 엔진에서 유한 상태 기계 (FSM : Finite State Machine) 는 무엇이며, 어떻게 활용할 수 있나요?
답변 >
**유한 상태 기계(FSM, Finite State Machine)**는 미리 정의된 상태(State)들과 상태 전환(Transition) 규칙을 사용하여 객체의 행동을 제어하는 프로그래밍 패턴입니다. 언리얼 엔진에서 FSM은 주로 캐릭터의 상태(걷기, 뛰기, 점프 등)나 AI 행동(순찰, 추격, 공격 등)을 관리하기 위해 사용됩니다.
FSM의 주요 개념
- 상태(State):
- 객체의 현재 상태를 나타냅니다. 예를 들어, 캐릭터의 상태는 Idle, Walking, Jumping 등이 될 수 있습니다.
- 상태 전환(Transition):
- 특정 조건(이벤트, 입력 등)이 만족되면 현재 상태에서 다른 상태로 전환됩니다. 예를 들어, Idle 상태에서 이동 키 입력이 발생하면 Walking 상태로 전환될 수 있습니다.
- 상태 동작(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) 노드를 활용하여 캐릭터 애니메이션이나 상태를 제어합니다.
- 애니메이션 블루프린트에서 상태 머신 사용:
- 애니메이션 블루프린트에서 State Machine 노드를 추가하여 각 상태에 대한 애니메이션을 정의하고, 상태 전환 규칙(Transition Rule)을 설정합니다.
- 예를 들어, Idle에서 Walking 상태로 전환하려면 "속도(Speed)가 0보다 크다"는 조건을 추가할 수 있습니다.
- 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 활용 시 장점
- 코드의 가독성과 유지보수성 향상:
- 상태와 전환 규칙을 명확히 정의하여 복잡한 행동 로직을 간결하게 관리할 수 있습니다.
- 확장성:
- 새로운 상태나 전환 규칙을 추가하기 쉽습니다.
- 디버깅 용이:
- 각 상태와 전환 규칙이 명확히 정의되어 디버깅과 문제 해결이 용이합니다.
요약
FSM은 캐릭터의 동작 및 AI 행동을 상태 기반으로 관리하기 위한 강력한 패턴입니다. 언리얼 엔진에서는 C++ 코드와 블루프린트, 애니메이션 블루프린트, Behavior Tree 등을 사용해 FSM을 구현할 수 있습니다. 이를 통해 게임 로직을 효율적으로 관리하고, 확장 가능하며 안정적인 상태 전환을 설계할 수 있습니다.
"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."
🎬 유튜브 채널 🎬
🎬 치지직 채널 🎬
'프로그래밍' 카테고리의 다른 글
👨💻 [Unreal] 언리얼 엔진에서 스태틱 메시 (Static Mesh) 는 무엇이며, 어떻게 활용할 수 있나요? (0) | 2024.11.26 |
---|---|
👨💻 [Unreal] 언리얼 엔진에서 하위 상태 머신 (Sub-State Machine) 는 무엇이며, 어떻게 활용할 수 있나요? (0) | 2024.11.25 |
👨💻 [Unreal] 언리얼 엔진에서 FTimerManager 는 무엇이며, 어떻게 활용할 수 있나요? (0) | 2024.11.25 |
👨💻 [Flutter] Flutter 에서 윈도우 플랫폼의 새창은 어떻게 생성하나요? (0) | 2024.11.22 |
👨💻 [Flutter] Flutter 에서 typedef 는 무엇이며, 어떻게 활용할 수 있나요? (0) | 2024.11.22 |