[C# Unity] State 패턴

Arthur·2023년 8월 16일
0
post-thumbnail

공부하게된 계기


인프런 Rookiss님 유니티 엔진 강의(링크)를 듣다가 State(상태) 패턴에 대한 것이 나왔습니다.

게임 개발에서는 State 패턴이 거의 필수지 않을까 생각했습니다.
그만큼 중요도가 높고 많이 사용되기 때문에 이렇게 글로 정리하게 되었습니다.

그렇다면 State 패턴은 무엇이고 게임 개발에서 자주 사용될까요?



State 패턴이란?


객체의 내부 상태가 변경될 때 해당 객체가 그의 행동을 변경할 수 있도록 하는 행동 디자인 패턴입니다. 객체가 행동을 변경할 때 객체가 클래스를 변경한 것처럼 보일 수 있습니다.
<refactoring.guru - 상태 패턴>

게임에서 케릭터들은 다양한 상태를 가지고 있습니다.
예로 들면 공격, 정지, 스킬 캐스팅, 스킬 시전 등

이렇듯 케릭터(객체)는 상태를 저장할 곳이 필요합니다.
이 때 State 패턴을 사용하면 좀 더 쉽게 관리할 수 있습니다.

State 패턴은 enum(열거형) 클래스를 사용하면 쉽게 구현할 수 있습니다.

게임 개발에서 사용하는 이유는 어느정도 알았으니, 코드로 알아보기 위해 예제 코드를 가져와봤습니다.



C# 예제 코드


public class PlayerController : MonoBehaviour
{
    public enum PlayerState
    {
        Die,
        Moving,
        Idle
    }

    PlayerState _state = PlayerState.Idle;

    void UpdateDie()
    {
        // ... 실행 로작 ...
    }

    void UpdateMoving()
    {
    	// ... 실행 로직 ...
    }

    void UpdateIdle()
    {
        // ... 실행 로직 ...
    }

    void Update()
    {
        switch (_state)
        {
            case PlayerState.Die:
                UpdateDie();
                break;
            case PlayerState.Moving:
                UpdateMoving();
                break;
            case PlayerState.Idle:
                UpdateIdle();
                break;
        }
    }
}

PlayerController는 말그래도 Player를 제어하는 클래스입니다.

유저는 움직이는(moving), 가만히 있는(Idle), 죽은(die) 3 가지 상태를 가지고 있습니다.
이런 상태를 enum 클래스를 통해 통합적으로 관리해줍니다.
만약에 유저의 State가 추가되면 enum 클래스에 추가를 해주면 됩니다.

그리고 if문이아닌 switch문을 사용해 가독성도 올라가고 해당 상태에 맞게 로직을 진행합니다.



State 패턴의 장점과 우려되는 점


장점

  • 상태 전이를 위한 조건 로직이 지나치게 복잡한 경우 이를 해소할 수 있다.
    - 상태 전이 로직 : 객체의 상태와 이들 간의 전이 방법을 제어하는 것으로, 클래스 내부 여기저기에 흩어져 존재하는 경향이 있다.
  • 상태를 enum 클래스를 통해 한 곳에 관리해 가독성이 좋아집니다.
  • 상태를 검증하기 위한 복잡하게 퍼져있는 if, else if, else를 효과적으로 제거할 수 있습니다.

우려되는 점

  • 하나의 enum 클래스에 너무 많은 상태가 추가되면 관리가 힘들어지지 않을까?
  • 기존에 추가된 상태의 네이밍이 변경되거나 기획이 변경되면 수정 소요가 발생
  • 추가된 상태가 기존의 상태와 중복되는 의미일 때의 문제점

장점은 다른 블로그를 참고하고 저의 생각을 조금 첨언해서 작성해봤습니다.

그리고 우려되는 점은 게임 개발을 하면서 우려되는 점을 제가 추론해서 적어봤습니다.
인프런 Rookiss님 강의에 내용을 보면 규모가 큰 MMORPG는 케릭당 애니메이션이 100 몇개가 있다고 합니다.
춤추기, 웃기 등 다양한 상태가 있었다고 합니다.



작성하면서 느낀 점


상태 패턴을 enum으로 구현하는 글을 간단하게 작성해봤습니다.
다른 글을 보면 interface을 사용해서 구현할 상태에 변화를 줄 기능을 추상화 한다고 합니다.

enum이 직관적이고 작성하기도 편해서 장점이 만다고 생각했는데,
생각해보니까 enum이 추가되면 switch문의 case가 늘어나고 코드가 복잡해져 유지보수가 어렵지 않을까도 생각했습니다.

각각의 장단점이 있겠지만 우선은 규모가 크지는 않기 때문에 enum을 사용해서 게임 개발을 하고 있습니다.
나중에 취업을 한다면 큰 규모의 게임은 어떻게 처리하는지 꼭 확인해보고 싶네요.



참고 자료


  • 기계인간 John Grib - 스테이트 패턴 (State Pattern) => 링크
  • refactoring.guru - State => 링크
  • 인프런 Rookiss님 - C# 유니티 엔진 섹션6 State 패턴 => 링크
  • 느리더라도 꾸준하게 - [디자인 패턴] 상태(State) 패턴이란? => 링크
  • Tecoble - 상태 패턴(State Pattern)을 사용해보자 => 링크
profile
기술에 대한 고민과 배운 것을 회고하는 게임 서버 개발자의 블로그입니다.

0개의 댓글