반응형
계층 유한 상태 머신 (HFSM) 가이드
1. 계층 유한 상태 머신이란?
계층 유한 상태 머신(HFSM)은 유한 상태 머신(FSM)의 확장된 형태로, 상태를 계층적으로 구성하여 복잡한 상태 관리 시스템을 구현하는 디자인 패턴입니다. 각 상태는 하위 상태를 가질 수 있으며, 이를 통해 상태 간의 공통 로직을 효율적으로 관리할 수 있습니다.
계층 유한 상태 머신 구조
graph TD
RootState[Root State]
IdleState[Idle State]
MoveState[Move State]
WalkState[Walk State]
RunState[Run State]
CombatState[Combat State]
AttackState[Attack State]
BlockState[Block State]
RootState --> IdleState
RootState --> MoveState
RootState --> CombatState
MoveState --> WalkState
MoveState --> RunState
CombatState --> AttackState
CombatState --> BlockState
classDef superState fill:#f3f4f6,stroke:#6b7280,stroke-width:2px
classDef subState fill:#f9fafb,stroke:#9ca3af,stroke-width:1px
class MoveState,CombatState superState
class WalkState,RunState,AttackState,BlockState subState
상태 계층 구조 설명:
• Root State: 전체 상태 머신의 최상위 상태
• Super States: 하위 상태를 포함하는 상태 (Move, Combat)
• Sub States: 실제 동작을 구현하는 최하위 상태
• Root State: 전체 상태 머신의 최상위 상태
• Super States: 하위 상태를 포함하는 상태 (Move, Combat)
• Sub States: 실제 동작을 구현하는 최하위 상태
2. 장점과 단점
장점
- 상태 간 공통 로직의 중복 제거
- 상태 전환 로직의 단순화
- 코드의 모듈화와 재사용성 향상
- 상태 관리의 체계화
- 디버깅 용이성
단점
- 초기 설계의 복잡성
- 상태 전환 시 성능 오버헤드
- 상태 간 의존성 관리 필요
- 메모리 사용량 증가 가능성
3. 구현 예제
기본 상태 클래스
public abstract class State
{
protected StateMachine stateMachine;
protected Entity entity;
protected State currentSubState;
protected State defaultSubState;
public State(StateMachine stateMachine, Entity entity)
{
this.stateMachine = stateMachine;
this.entity = entity;
}
public virtual void Enter()
{
if (defaultSubState != null)
{
currentSubState = defaultSubState;
currentSubState.Enter();
}
}
public virtual void Update()
{
currentSubState?.Update();
}
public virtual void Exit()
{
currentSubState?.Exit();
}
public virtual void ChangeSubState(State newSubState)
{
currentSubState?.Exit();
currentSubState = newSubState;
currentSubState.Enter();
}
}
슈퍼 상태 클래스
public class MoveState : State
{
public MoveState(StateMachine stateMachine, Entity entity)
: base(stateMachine, entity)
{
defaultSubState = new WalkState(stateMachine, entity);
}
public override void Enter()
{
base.Enter();
entity.animator.SetBool("IsMoving", true);
}
public override void Update()
{
Vector3 moveInput = new Vector3(
Input.GetAxis("Horizontal"),
0,
Input.GetAxis("Vertical")
);
if (moveInput.magnitude == 0)
{
stateMachine.ChangeState(new IdleState(stateMachine, entity));
return;
}
if (Input.GetKey(KeyCode.LeftShift))
{
ChangeSubState(new RunState(stateMachine, entity));
}
else
{
ChangeSubState(new WalkState(stateMachine, entity));
}
base.Update();
}
public override void Exit()
{
base.Exit();
entity.animator.SetBool("IsMoving", false);
}
}
서브 상태 클래스
public class WalkState : MoveState
{
private float moveSpeed = 3f;
public WalkState(StateMachine stateMachine, Entity entity)
: base(stateMachine, entity) { }
public override void Enter()
{
base.Enter();
entity.animator.SetBool("IsWalking", true);
}
public override void Update()
{
Vector3 moveInput = new Vector3(
Input.GetAxis("Horizontal"),
0,
Input.GetAxis("Vertical")
);
entity.controller.Move(moveInput * moveSpeed * Time.deltaTime);
entity.animator.SetFloat("MoveSpeed", moveInput.magnitude);
}
public override void Exit()
{
base.Exit();
entity.animator.SetBool("IsWalking", false);
}
}
4. Unity에서의 활용
4.1 애니메이션 연동
계층 유한 상태 머신은 Unity의 애니메이터 컨트롤러의 서브 상태 머신과 유사한 개념입니다. 각 슈퍼 상태와 서브 상태에서 애니메이션 파라미터를 설정하고, 상태 전환 시 애니메이션 블렌딩을 처리할 수 있습니다.
4.2 성능 최적화
- 상태 전환 시 메모리 할당 최소화
- 상태 업데이트 주기 최적화
- 상태 전환 조건 캐싱
5. 결론
계층 유한 상태 머신은 복잡한 게임 로직을 체계적으로 관리할 수 있는 강력한 도구입니다. 상태의 계층적 구조를 통해 코드의 재사용성과 유지보수성을 크게 향상시킬 수 있으며, 특히 캐릭터 AI나 플레이어 컨트롤과 같은 복잡한 상태 관리가 필요한 시스템에서 효과적입니다.
반응형
LIST
'Unity' 카테고리의 다른 글
퀘스트 시스템 (2) | 2025.04.28 |
---|---|
TIL - Addressable 설계 (2) | 2025.04.23 |
State Machine (0) | 2025.04.08 |
Unity Custom Editor - 윈도우 만들기 (0) | 2025.04.06 |
프로토타입 패턴 (0) | 2025.04.06 |