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 패턴을 구현하는 것은 간단하며, 깔끔하고 유지 관리가 용이한 코드를 만드는 데 유용합니다.