State 패턴은 객체 지향 프로그래밍에서 객체의 내부 상태에 따라 객체의 동작을 변경하는 데 널리 사용되는 디자인 패턴입니다. 이 패턴을 사용하면 메인 클래스를 수정하지 않고도 여러 상태 클래스를 추가할 수 있으므로 디자이너와 개발자에게 다양하고 유연한 옵션을 제공 할 수 있습니다. 이 글에서는 State 패턴의 구성 요소와 이를 C#으로 Unity에서 구현하는 방법을 자세히 살펴보겠습니다.

State 패턴의 구성 요소

State 패턴은 세 가지 주요 컴포넌트, 즉 Context 클래스, IState 인터페이스, ConcreteState 클래스로 구성됩니다. 각 컴포넌트를 자세히 살펴보겠습니다.

Context 클래스

Context 클래스는 State 패턴의 메인 클래스입니다. 클라이언트가 객체의 상태 변경을 요청할 수 있는 인터페이스를 정의하고 현재 상태에 대한 참조를 보유합니다. 이 클래스는 IState 인터페이스와 ConcreteState 클래스 사이의 다리 역할을 합니다.

IState 인터페이스

IState 인터페이스는 ConcreteState 클래스에 대한 구현 계약을 제공합니다. 또한 이 인터페이스는 ConcreteState 클래스가 구현해야 하는 메서드와 프로퍼티를 정의합니다. IState 인터페이스는 Context 클래스에서 ConcreteState 클래스의 Handle 메서드를 호출하는 데 사용됩니다.

ConcreteState 클래스

ConcreteState 클래스는 각 상태에 대한 특정 동작을 구현합니다. 이러한 클래스에는 Context 객체가 호출하여 상태의 동작을 트리거할 수 있는 공용 메서드인 ” Handle”이 있습니다. ConcreteState 클래스는 각 상태에 대한 특정 동작을 제공하는 역할을 담당합니다.

유니티에서 C#으로 State 패턴 구현하기

먼저 Unity에서 C#을 사용하여 State 패턴을 구현해보겠습니다. 다음은 C#을 사용하여 Unity에서 State 패턴을 구현하는 방법의 예시입니다.

먼저 IState 인터페이스를 생성하여 ConcreteState 클래스가 구현해야 하는 Handle 메서드를 정의합니다.

public interface IState
{
    void Handle();
}

다음으로 IState 인터페이스를 만들고, 각 상태에 대한 특정 동작을 제공하는 ConcreteState 클래스를 생성하겠습니다.

public class ConcreteStateA : IState
{
    public void Handle()
    {
        // 상태 A의 구현
    }
}

public class ConcreteStateB : IState
{
    public void Handle()
    {
        // 상태 B의 구현
    }
}

마지막으로 현재 상태에 대한 참조를 보관하고 클라이언트가 객체의 상태 변경을 요청할 수 있는 인터페이스를 제공하는 Context 클래스를 생성합니다.

public class Context
{
    private IState _currentState;

    public Context(IState initialState)
    {
        _currentState = initialState;
    }

    public void Request()
    {
        _currentState.Handle();
    }

    public void SetState(IState newState)
    {
        _currentState = newState;
    }
}

유니티의 Start 메소드에서 이를 사용해 보겠습니다.

public class Example : MonoBehaviour
{
    void Start()
    {
        Context context = new Context(new ConcreteStateA());
        context.Request(); // 출력: ConcreteStateA 처리

        context.SetState(new ConcreteStateB());
        context.Request(); // 출력: ConcreteStateB 처리
    }

결론

State 패턴은 개발자가 내부 상태에 따라 객체의 동작을 변경할 수 있는 강력한 디자인 패턴입니다. 이 패턴은 세 가지 컴포넌트, 즉 Context 클래스, IState 인터페이스, ConcreteState 클래스로 구성됩니다. Unity에서 C#으로 State 패턴을 구현하는 것은 간단하며, 깔끔하고 유지 관리가 용이한 코드를 만드는 데 유용합니다.

더 공부할 자료 - 개발 능력 다양화를 위한 학습의 필요성

유니티 엔진의 대안으로서, 인디 개발자들에게 선풍적인 인기를 끌고 있는 엔진이 바로 고도 엔진입니다. 혹시 고도 엔진을 배워 보려고 하신다면, 다음의 온라인 강의를 체크해 보시기 바랍니다.

초보자를 위한 고도엔진 게임 개발 입문