

★KEYWORD★
유한 상태 기계 (FSM) / 상태(state)를 기반으로 동작을 제어하는 방식을 구현하기 위한 게임 디자인 패턴 /
한 번에 하나의 상태만을 가짐
유한 상태 기계 (Finite-state machine)
정의
유한 상태 기계(finite-state machine, FSM) 또는 유한 오토마톤(finite automaton, FA; 복수형: 유한 오토마타 finite automata)는 컴퓨터 프로그램과 전자 논리 회로를 설계하는 데에 쓰이는 수학적 모델이다. 간단히 '상태 기계'라고 부르기도 한다. 유한 상태 기계는 유한한 개수의 상태를 가질 수 있는 오토마타, 즉 추상 기계라고 할 수 있다. 이러한 기계는 한 번에 오로지 하나의 상태만을 가지게 되며, 현재 상태(Current State)란 임의의 주어진 시간의 상태를 칭한다. 이러한 기계는 어떠한 사건(Event)에 의해 한 상태에서 다른 상태로 변화할 수 있으며, 이를 전이(Transition)이라 한다. 특정한 유한 오토마톤은 현재 상태로부터 가능한 전이 상태와, 이러한 전이를 유발하는 조건들의 집합으로서 정의된다.
사용 시 장점
- 명확성 : 각 상태가 명확하게 정의되어 있어, 시스템의 현재 상태를 쉽게 파악할 수 있음
- 유지 보수성 : 상태를 추가하거나 변경할 때 기존 코드를 크게 수정하지 않아도 되므로 유지/보수가 용이함
- 디버깅 용이성 : 상태 전환 로그를 통해 문제 발생 시점을 빠르게 진단할 수 있음
유니티 에서의 FSM 구현 예시
간단한 스크립트를 통해 구현하는 방법
게임 내 캐릭터가 '대기', '이동', '공격' 세 가지 상태를 가지는 간단한 FSM의 예시
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
|
using UnityEngine;
public class CharacterFSM : MonoBehaviour
{
private enum State
{
Idle,
Move,
Attack
}
private State currentState;
private void Start()
{
currentState = State.Idle;
}
private void Update()
{
switch (currentState)
{
case State.Idle:
if (Input.GetKeyDown(KeyCode.Space))
{
ChangeState(State.Attack);
}
else if (Input.GetAxisRaw("Horizontal") != 0 || Input.GetAxisRaw("Vertical") != 0)
{
ChangeState(State.Move);
}
break;
case State.Move:
MoveCharacter();
if (Input.GetKeyUp(KeyCode.LeftArrow) || Input.GetKeyUp(KeyCode.RightArrow) ||
Input.GetKeyUp(KeyCode.UpArrow) || Input.GetKeyUp(KeyCode.DownArrow))
{
ChangeState(State.Idle);
}
if (Input.GetKeyDown(KeyCode.Space))
{
ChangeState(State.Attack);
}
break;
case State.Attack:
Attack();
ChangeState(State.Idle);
break;
}
}
private void ChangeState(State newState)
{
currentState = newState;
}
private void MoveCharacter()
{
// 캐릭터 이동 로직
Debug.Log("Moving");
}
private void Attack()
{
// 공격 로직
Debug.Log("Attacking");
}
}
|
cs |
사용 시 주의할 점
- 상태 간의 전환 조건이 명확해야 함
- 상태가 너무 많아지지 않도록 주의해야 함 (상태가 과도하게 많아지면 관리가 복잡해지고 코드 가독성이 떨어짐)
정리
상태(state)를 기반으로 동작을 제어하는 방식을 구현하기 위한 게임 로직에서 많이 사용되는 디자인 패턴이다.
핵심은 단 하나의 상태만을 가진다는 점이다. 상태를 기준으로 어떤 동작을 수행할지 결정하기 때문에 현재 상태만 알 수 있으면 어떤 동작을 행하려 하는지 명확히 파악할 수 있고 구현이 쉽다는 장점이 있다.
출처 및 참고 : https://www.ibatstudio.com/author/admin/

HyunZzang의 프로그래밍 공간 / 함께 공부해요!!
도움이 되셨다면 "좋아요❤️" 또는 "구독👍🏻" 부탁드립니다 :)