카테고리 없음
Unity 디자인 패턴 - 관찰자 패턴과 전략 패턴
이황충
2024. 6. 20. 20:58
유니티 게임개발캠프 TIL 41일차
관찰자 패턴
정의: 관찰자 패턴은 객체의 상태 변화에 따라 다른 객체들이 자동으로 업데이트 되도록 하는 행위 디자인 패턴입니다. 주제(Subject) 객체가 상태 변화를 감지하면, 관찰자(Observer) 객체들에게 통지합니다.
주요 개념:
- 주제(Subject): 상태를 유지하고 관찰자들에게 변경 사항을 알리는 객체.
- 관찰자(Observer): 주제의 변경 사항을 통보받아야 하는 객체들.
Unity에서의 구현:
- 주제 클래스: 관찰자 리스트를 유지하고, 관찰자를 추가, 제거 및 통지하는 메서드를 제공합니다.
- 관찰자 인터페이스: 관찰자들이 구현해야 하는 Update 또는 OnNotify 메서드를 정의합니다.
- 구체적 관찰자 클래스: 관찰자 인터페이스를 구현하고, 통지 받을 때 특정 작업을 수행합니다.
예제 시나리오: 플레이어의 체력 변화 시 여러 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에서의 구현:
- 전략 인터페이스: 공통의 메서드를 정의합니다.
- 구체적 전략들: 전략 인터페이스를 구현합니다.
- 컨텍스트 클래스: 전략 객체에 대한 참조를 유지하고, 실행을 전략에 위임합니다.
예제 시나리오: 캐릭터가 걷기와 날기 동작을 전환할 수 있는 이동 시스템을 고려해보세요.
// 전략 인터페이스
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);
}
}
결론
관찰자 패턴은 상태 변화 알림 시스템을 유연하고 비결합적으로 만들 수 있어, 여러 객체가 하나의 상태 변화에 반응해야 하는 상황에서 매우 유용합니다. 반면, 전략 패턴은 특정 작업을 수행하는 여러 알고리즘을 동적으로 교체할 수 있어, 게임 내 다양한 행동을 구현하는 데 큰 도움이 됩니다.
이러한 패턴들을 게임의 요구 사항에 맞게 적절히 사용하는 것이 중요하다는 것입니다. 예를 들어, 여러 객체가 다른 객체의 변경 사항에 반응해야 할 때는 관찰자 패턴을 사용하고, 특정 작업을 위한 여러 알고리즘이 런타임에 변경될 필요가 있을 때는 전략 패턴을 사용하는 것이 좋습니다.