옵저버 패턴
관찰자 패턴은 일부 개체('관찰자'라고 함)가 다른 개체('주체')를 관찰하고 상태 변경에 대한 알림을 받을 수 있도록 하는 동작 디자인 패턴입니다. 이 패턴은 한 개체를 변경하려면 다른 개체도 변경해야 하고 얼마나 많은 개체를 변경해야 하는지 모를 때 특히 유용합니다.
뉴스레터 구독이라고 생각하면 됩니다. 뉴스레터를 구독하면(관찰자가 됨) 뉴스레터 서비스(제목)에서 새 콘텐츠가 있을 때마다 업데이트를 보냅니다.
Unity에서 옵저버 패턴 구현하기
게임에서 플레이어의 체력이 있는 경우를 예로 들어 보겠습니다. 플레이어의 체력이 변경될 때마다 다른 UI 요소(예: 체력 표시줄 또는 체력 텍스트 필드)가 업데이트되어야 합니다.
다음은 PlayerHealth 클래스('Subject')입니다.
csharpCopy code
using System;
using UnityEngine;
public class PlayerHealth : MonoBehaviour
{
public event Action<float> OnHealthChanged;
private float health;
public void ChangeHealth(float amount)
{
health += amount;
OnHealthChanged?.Invoke(health);
}
}
PlayerHealth 클래스에서 OnHealthChanged 이벤트를 정의합니다. 플레이어의 체력이 변경될 때마다 이 이벤트가 호출됩니다.
이제 관찰자 중 하나인 HealthBar 클래스를 살펴보겠습니다.
csharpCopy code
using UnityEngine;
public class HealthBar : MonoBehaviour
{
[SerializeField] private PlayerHealth playerHealth;
private void Awake()
{
playerHealth.OnHealthChanged += UpdateHealthBar;
}
private void UpdateHealthBar(float health)
{
// Code to update health bar here
Debug.Log($"Health updated to {health}");
}
}
HealthBar 클래스에서 Awake 메서드에서 PlayerHealth의 OnHealthChanged 이벤트를 구독합니다. OnHealthChanged 이벤트가 호출될 때마다 UpdateHealthBar 메서드가 호출됩니다.
관찰자 패턴을 사용하면 코드가 더 유연하고 체계적으로 정리됩니다. PlayerHealth는 HealthBar에 대해 알 필요가 없으므로 PlayerHealth 클래스를 HealthBar 클래스에서 분리했습니다.
마무리
옵저버 패턴은 소프트웨어 개발, 특히 많은 개체가 종종 다른 개체의 작업에 응답해야 하는 게임 개발에서 중요한 디자인 패턴입니다. 관찰자 패턴을 적용하면 코드를 보다 강력하고 체계적이며 확장 가능하게 만들 수 있습니다.
'Unity > Design Pattern' 카테고리의 다른 글
소프트웨어 개발 3대 원칙 : DRY, KISS, YAGNI (0) | 2023.08.10 |
---|---|
Unity로 이해하는 상태 패턴 (State Pattern) (0) | 2023.08.09 |
Unity로 이해하는 팩토리 패턴 (Factory Pattern) (0) | 2023.08.07 |
Unity로 이해하는 어댑터 패턴 (Adapter Pattern) (0) | 2023.08.06 |
Unity로 이해하는 전략 패턴(Strategy Pattern) (0) | 2023.07.20 |