// Subject
public class HealthSystem
{
public event Action<int> OnHealthChanged;
private int health = 100;
public void TakeDamage(int amount)
{
health -= amount;
OnHealthChanged?.Invoke(health); // 옵저버들에게 알림
}
}
// Observer
public class HealthUI : MonoBehaviour
{
[SerializeField] private HealthSystem healthSystem;
void OnEnable()
{
healthSystem.OnHealthChanged += UpdateHealthBar;
}
void OnDisable()
{
healthSystem.OnHealthChanged -= UpdateHealthBar;
}
void UpdateHealthBar(int currentHealth)
{
Debug.Log("현재 체력: " + currentHealth);
}
}
TIL: 옵저버 패턴 (Observer Pattern)
오늘 배운 것
옵저버 패턴은 객체 간 1:N 의존 관계를 정의해,
한 객체의 상태 변화가 있을 때, 의존된 객체들이 자동으로 알림을 받도록 하는 패턴이다.
즉, **"Subject(관찰 대상)"**와 **"Observer(관찰자)"**가 존재하고,
Subject가 변경되면 등록된 Observer들이 알림을 받아 반응한다.
개념 요약
구성 요소설명
| Subject (Publisher) | 상태를 갖고 있고, 변화가 생기면 Observer에게 알림 |
| Observer (Subscriber) | Subject에 등록되고, 상태 변화 시 콜백을 받음 |
왜 필요한가?
- 객체 간 결합도를 낮춘다 (Loose Coupling)
- 이벤트 기반 시스템에서 매우 유용
- UI, 이벤트 시스템, 데이터 동기화 등에 자주 사용됨
Unity에서 활용 예
- 체력바(HP UI): 체력 변화 알림 받음
- 미션 시스템: 특정 행동을 하면 알림 받아 퀘스트 진행
- 타일맵/데이터 업데이트: 타일 상태 변경 시 UI 동기화
관련 개념
개념설명
| 이벤트 & 델리게이트 | C#에서 옵저버 패턴을 가장 쉽게 구현하는 방식 |
| ScriptableObject 이벤트 | Unity에서 자주 쓰이는 옵저버 구현 형태 |
| Reactive Programming | 옵저버 패턴을 더 강력하게 확장한 형태 (ex. UniRx) |