Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
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
Tags
more
Archives
Today
Total
관리 메뉴

zyeon's 작심삼일 코딩 공부

플레이어 상태, 상태 머신 본문

unity

플레이어 상태, 상태 머신

젼뀨 2024. 9. 12. 04:10

상태 머신이란 특정 상태에 따라 다른 동작을 수행하는 구조를 의미한다.

 

플레이어의 4가지 상태 (idle - move - hit - die)

 

public enum PlayerState
{
    idle,
    move,
    hit,
    die,
};

PlayerState m_playerState;
Animator m_playerAnimator;

난 enum 열거형을 사용해 플레이어 상태 (idle, move, hit, die) 정의했다.

PlayerState m_playerState는 현재 플레이어 상태를 저장할 변수이다.

 

public void ChangeState(PlayerState newState)
{
    if (m_playerState == newState) return;

    m_playerState = newState;

    switch (newState)
    {
        case PlayerState.idle:
            EnterIdleState();
            break;
        case PlayerState.move:
            EnterMoveState();
            break;
        case PlayerState.hit:
            EnterHitState();
            break;
        case PlayerState.die:
            EnterDieState();
            break;
    }
}

상태 전환을 해주는 함수 ChangeState()로 플레이어 상태를 변경하고, 상태에 따라 특정 로직 실행한다.

이 부분이 상태 머신의 핵심 요소이다.

 

private void EnterIdleState()
{
    m_playerAnimator.SetInteger("state", 0);
}

private void EnterMoveState()
{
    m_playerAnimator.SetInteger("state", 1);
}

private void EnterHitState()
{
    m_playerAnimator.SetInteger("state", 2);
    if (m_coroutine == null)
        m_coroutine = StartCoroutine(PlayerHit());
}

private void EnterDieState()
{
    m_playerAnimator.SetInteger("state", 3);
    GameManager.Instance.gameState = GameManager.GameState.gameOver;
}

나는 상태 전환시 많은 행동을 하진 않지만, 행동이 많아질 경우에는

위와 같이 각 상태에 따라 전용 메서드를 만드는게 가독성 면에서 좋다.


2024.08.28 - [unity] - 2.5D 게임에서 캐릭터 이동 구현

 

2.5D 게임에서 캐릭터 이동 구현

나는 2D 캐릭터와 3D 배경을 가진 게임을 제작하였다.적합한 표현인지는 모르겠지만 편의상 2.5D 게임이라고 하겠다. 3D 오브젝트와 다르게, 보는 방향에 따라 플레이어 이미지를 달리 해줘야 한

zyeon-25.tistory.com

위 글에서도 캐릭터 이동 시 enum 을 사용했지만 상태 머신이라고 보기에는 힘들다.

상태 전환에 대한 로직이 분산되어 있어 명확하지 않기 때문이다.