카테고리 없음

Unity 디자인 패턴 - 관찰자 패턴과 전략 패턴

이황충 2024. 6. 20. 20:58

유니티 게임개발캠프 TIL 41일차

관찰자 패턴

정의: 관찰자 패턴은 객체의 상태 변화에 따라 다른 객체들이 자동으로 업데이트 되도록 하는 행위 디자인 패턴입니다. 주제(Subject) 객체가 상태 변화를 감지하면, 관찰자(Observer) 객체들에게 통지합니다.

주요 개념:

  • 주제(Subject): 상태를 유지하고 관찰자들에게 변경 사항을 알리는 객체.
  • 관찰자(Observer): 주제의 변경 사항을 통보받아야 하는 객체들.

Unity에서의 구현:

  1. 주제 클래스: 관찰자 리스트를 유지하고, 관찰자를 추가, 제거 및 통지하는 메서드를 제공합니다.
  2. 관찰자 인터페이스: 관찰자들이 구현해야 하는 Update 또는 OnNotify 메서드를 정의합니다.
  3. 구체적 관찰자 클래스: 관찰자 인터페이스를 구현하고, 통지 받을 때 특정 작업을 수행합니다.

예제 시나리오: 플레이어의 체력 변화 시 여러 UI 요소가 업데이트되는 건강 시스템을 고려해보세요.

// 주제 클래스
public class PlayerHealth : MonoBehaviour
{
    private List<IObserver> observers = new List<IObserver>();
    private int health;
    
    public void AddObserver(IObserver observer) => observers.Add(observer);
    public void RemoveObserver(IObserver observer) => observers.Remove(observer);
    
    public void SetHealth(int newHealth)
    {
        health = newHealth;
        NotifyObservers();
    }
    
    private void NotifyObservers()
    {
        foreach (var observer in observers)
        {
            observer.Update();
        }
    }
}

// 관찰자 인터페이스
public interface IObserver
{
    void Update();
}

// 구체적 관찰자 클래스
public class HealthUI : MonoBehaviour, IObserver
{
    public void Update()
    {
        // UI 요소 업데이트
    }
}

전략 패턴

정의: 전략 패턴은 행위 디자인 패턴으로, 알고리즘 군을 정의하고, 각각을 캡슐화하여, 이들을 상호 교환 가능하게 만듭니다. 전략 패턴을 사용하면 알고리즘을 사용하는 클라이언트로부터 독립적으로 알고리즘을 변경할 수 있습니다.

주요 개념:

  • 전략 인터페이스: 모든 지원 알고리즘이 구현해야 하는 메서드를 정의합니다.
  • 구체적 전략들: 전략 인터페이스를 구현한 다양한 알고리즘들.
  • 컨텍스트: 전략 객체를 사용하여 알고리즘을 실행하는 클래스.

Unity에서의 구현:

  1. 전략 인터페이스: 공통의 메서드를 정의합니다.
  2. 구체적 전략들: 전략 인터페이스를 구현합니다.
  3. 컨텍스트 클래스: 전략 객체에 대한 참조를 유지하고, 실행을 전략에 위임합니다.

예제 시나리오: 캐릭터가 걷기와 날기 동작을 전환할 수 있는 이동 시스템을 고려해보세요.

// 전략 인터페이스
public interface IMovementStrategy
{
    void Move(Character character);
}

// 구체적 전략들
public class WalkingStrategy : IMovementStrategy
{
    public void Move(Character character)
    {
        // 걷기 로직
    }
}

public class FlyingStrategy : IMovementStrategy
{
    public void Move(Character character)
    {
        // 날기 로직
    }
}

// 컨텍스트 클래스
public class Character : MonoBehaviour
{
    private IMovementStrategy movementStrategy;
    
    public void SetMovementStrategy(IMovementStrategy strategy)
    {
        movementStrategy = strategy;
    }
    
    void Update()
    {
        movementStrategy.Move(this);
    }
}

결론

관찰자 패턴은 상태 변화 알림 시스템을 유연하고 비결합적으로 만들 수 있어, 여러 객체가 하나의 상태 변화에 반응해야 하는 상황에서 매우 유용합니다. 반면, 전략 패턴은 특정 작업을 수행하는 여러 알고리즘을 동적으로 교체할 수 있어, 게임 내 다양한 행동을 구현하는 데 큰 도움이 됩니다.

이러한 패턴들을 게임의 요구 사항에 맞게 적절히 사용하는 것이 중요하다는 것입니다. 예를 들어, 여러 객체가 다른 객체의 변경 사항에 반응해야 할 때는 관찰자 패턴을 사용하고, 특정 작업을 위한 여러 알고리즘이 런타임에 변경될 필요가 있을 때는 전략 패턴을 사용하는 것이 좋습니다.