[20260223] StatePattern

SmartBear·2026년 2월 23일

State Pattern

문제 코드

public enum StateList
{
   Idle, Move, Jump, Attack
}

public class PlayerState : MonoBehaviour
{
   private int _direction;
   [SerializeField] private StateList CurrentState; 

   private void Update() 
   {
     // 키 입력 에 따른 각 상태 변화
     
   }

   private void Idle()
   {
     // 기능 로직
     // 애니메이션 변화 로직
     // 예외처리 등
   }

   private void Move()
   {
     // 기능 로직
     // 애니메이션 변화 로직
     // 예외처리 등
   }

   private void Jump()
   {
     // 기능 로직
     // 애니메이션 변화 로직
     // 예외처리 등
   }

   private void Attack()
   {
     // 기능 로직
     // 애니메이션 변화 로직
     // 예외처리 등
   }
}
  • 상태(State)가 늘어나면, 조건에 대한 분기수가 기하급수적으로 늘어난다.
  • 상태가 서로를 안다 (엮여있다)
  • 책임이 Player 에게 몰려있다.
  • 읽기도 수정도 어렵고 수정시 고리스크가 있다.

Remember!

게임 기능이 늘어나면 조건문을 늘리는 것이 아니라 상태 늘린다.

Q. 상태 란??

A. 어떤 객체의 특정 상황내 행동 규칙

구조

User Input -> Player -> StateMachine -> State.Update()

Unity 에서 어떤 객체

PlayerController.cs 예시

using UnityEngine;

// 입력 처리 / 물리 판정 / 애니메이션 결정
public class Player : Monobehavior
{
    Rigidbody2D _rb;
    Animator _animator;

    StateMachine _stateMachine;

    IdleState _idleState;
    MoveState _moveState; 
    JumpState _jumpState;

    void Start() 
    {
        _stateMachine = new StateMachine();
        _idleState = new IdleState(this);
        _moveState = new MoveState(this);
        _jumpState = new JumpState(this);

        _stateMachine.ChangeState(_idleState);
    }

    void Update()
    {
        _stateMachine.Update();
    }

    public void ChangeState(Istate state) 
    {
        _stateMachine.ChangeState(state);
    }
}

핵심 정리

상태(State)물리 엔진, 애니메이션등 직접적인 시스템을 관리하지 않음.
상태(State) 관리하는 객체(MonoBehaviour 를 상속받은)가 관리 한다.

선택 실습

점프 상태에서 공격 구현해보기

profile
Python Dev with Infra -> Game Programmer

0개의 댓글