FSM ( Finite State Machine )
FSM 은 "유한 상태 기계" 또는 "유한 상태 자동자" 라고 부른다.
- FSM : 유한한 개수의 상태를 가지며 , 입력에 따라 상태가 전이되는 모델
- 유한 상태 기계 : FSM 의 직역으로 , 컴퓨터 과학이나 공학에서 널리 쓰이는 용어이다.
- 유한 상태 자동자 : 이론적 컴퓨터 과학 ( 형식 언어 , 오토마타 이론 등 ) 에서는 "자동자" 라는 표현을 사용
- 상태 ( State ) : 객체가 특정 시점에 가지는 행동 또는 모드 ( Idle , Move , Attack 등 )
- 전이 ( Transition ) : 상태 간 이동을 결정하는 조건 또는 이벤트
- 상태 패턴 ( State Pattern ) : 객체의 상태에 따라 행동을 변경하는 디자인 패턴
- 상태 기계 : 게임 개발에서 FSM 을 지칭할 때 자주 쓰이는 표현
FSM 은 캐릭터나 오브젝트의 상태 ( State ) 를 체계적으로 관리하기 위한 구조 / 패턴
FSM 은 상태를 기반으로 동작을 제어하는 시스템을 구현하기 위한 모델 중 하나이다.
상태 변화에 따른 객체의 동작이 복잡하고 , 여러 가지 조건에 대응해 상태를 변경해야 하는 경우 사용한다.
유니티에서는 애니메이션 컨트롤러가 유한 상태 머신을 이용해 구현되어 있다.
부여된 객체의 상태 변화에 따른 애니메이션을 유동적으로 관리할 수 있게 한다.
하나의 파라미터에서는 한 가지의 상태만 가질 수 있고 , 다수의 파라미터를 사용해 모델의 움직임과 표현을 사용하기도 한다.
현재 상태 ( Current State )가 있고 , 그 상태에서 특정 조건 ( Trigger / Event )이 발생하면 다른 상태로 전이되는 구조이다.
| 상태 ( State ) | 설명 |
| Idle | 아무 입력이 없을 때 대기 |
| Move | 이동 중 |
| Attack | 공격 중 |
- "플레이어가 공격 버튼을 누르면"
└ Idle → Attack 상태로 전이 ( Transition )
작동 원리
- 현재 상태를 가진다 ( CurrentState )
└ currentState = PlayerState.Idle; - 입력 또는 조건을 감지한다
└ 키 입력 , 충돌 , 체력 변화 등 - 조건에 따라 상태를 전환한다 ( Transition )
└ if ( Input.GetKeyDown ( KeyCode.Space ) ) currentState = PlayerState.Attack; - 각 상태별로 다른 행동 ( Logic ) 을 수행한다
└ Idle : 애니메이션 Idle 실행
└ Move : transform 이동
└ Attack : 공격 모션 + 데미지 판정
▼ 간단한 FSM 구조 예시 코드
using UnityEngine;
public class PlayerFSM : MonoBehaviour
{
private enum State
{
Idle,
Move,
Attack
}
private State currentState = State.Idle;
void Update()
{
switch (currentState)
{
case State.Idle:
if (Input.GetKey(KeyCode.W))
ChangeState(State.Move);
break;
case State.Move:
Move();
if (Input.GetKeyDown(KeyCode.Space))
ChangeState(State.Attack);
break;
case State.Attack:
Attack();
break;
}
}
void ChangeState(State newState)
{
Debug.Log($"상태 변경 : {currentState} → {newState}");
currentState = newState;
}
void Move() => transform.Translate(Vector3.forward * Time.deltaTime * 3f);
void Attack() => Debug.Log("공격!");
}
FSM 을 쓰는 이유
| 유지 보수가 쉽다 | 상태별로 코드 분리 |
| 버그 감소 | 조건 전이 명확 |
| 애니메이션 / AI 제어에 용이하다 | Animator , NavMesh 등과 연동이 쉽다 |
| 확장성 높음 | 새 상태 추가가 간단하다 ( Jump 추가 등 ) |
참고 자료
https://learn.unity.com/tutorial/finite-state-machines-1
'🧊Unity Basic > 디자인패턴' 카테고리의 다른 글
| State Pattern (0) | 2025.11.20 |
|---|---|
| MVC 패턴 (0) | 2025.11.10 |
| Adapter Pattern 핵심 코드 (0) | 2025.10.24 |
| Observer Pattern (0) | 2025.10.21 |
| Singleton 과 Generic (0) | 2025.10.21 |