🔭 Unity 디자인 패턴 - 옵저버(Observer) 패턴
1. 옵저버 패턴이란?
옵저버(Observer) 패턴은 어떤 객체의 상태가 변경될 때, 그 객체를 "구독"하고 있는 다른 객체들에게 자동으로 알림을 보내는 구조입니다. Unity에서는 UI나 게임 오브젝트가 데이터나 이벤트의 변경을 실시간으로 반영해야 할 때 자주 사용됩니다.
"플레이어의 체력이 변하면 체력바가 자동으로 바뀌는 것"이 대표적인 예입니다.
2. 언제 사용하나요?
- 플레이어 체력/마나 등의 수치 변화 → UI 업데이트
- 게임 설정 변경 → 여러 오브젝트에 즉시 반영
- 이벤트 중심 구조로 게임 로직을 관리할 때
3. 구조 설명
- Subject (발행자): 상태를 가지고 있는 객체. 변화가 생기면 옵저버에게 알림
- Observer (구독자): Subject의 변화를 감지하고 반응하는 객체들
4. Unity 예제: 플레이어 체력 변화 → 체력바 UI 갱신
📦 인터페이스 정의 (옵저버 공통)
public interface IHealthObserver
{
void OnHealthChanged(int current, int max);
}
🎮 Subject: Player
using System.Collections.Generic;
using UnityEngine;
public class Player : MonoBehaviour
{
private int maxHp = 100;
private int currentHp;
private List<IHealthObserver> observers = new();
private void Start()
{
currentHp = maxHp;
}
public void TakeDamage(int damage)
{
currentHp = Mathf.Max(currentHp - damage, 0);
NotifyObservers();
}
public void Heal(int amount)
{
currentHp = Mathf.Min(currentHp + amount, maxHp);
NotifyObservers();
}
public void AddObserver(IHealthObserver observer)
{
if (!observers.Contains(observer)) observers.Add(observer);
}
public void RemoveObserver(IHealthObserver observer)
{
if (observers.Contains(observer)) observers.Remove(observer);
}
private void NotifyObservers()
{
foreach (var observer in observers)
{
observer.OnHealthChanged(currentHp, maxHp);
}
}
}
🖼️ Observer: HealthBar
using UnityEngine;
using UnityEngine.UI;
public class HealthBar : MonoBehaviour, IHealthObserver
{
[SerializeField] private Slider slider;
private Player player;
private void Start()
{
player = FindObjectOfType<Player>();
player?.AddObserver(this);
OnHealthChanged(playerHp: 100, maxHp: 100); // 초기화
}
public void OnHealthChanged(int playerHp, int maxHp)
{
slider.value = (float)playerHp / maxHp;
}
private void OnDestroy()
{
player?.RemoveObserver(this);
}
}
5. 정리 및 장단점
✅ 장점
- 느슨한 결합 (Player와 UI는 서로 직접 몰라도 됨)
- 실시간 반응 구조
- 여러 객체에 동일한 변화 전파 가능
❌ 단점
- Observer 등록/해제 누락 시 예기치 않은 동작 발생
- 규모가 커지면 디버깅이 어려워질 수 있음
✅ 마무리 한 줄 요약
옵저버 패턴은 "어떤 일이 생기면 알려줄게" 라는 약속으로, 게임 내 실시간 반응형 구조를 만드는 데 매우 유용한 패턴입니다.
'C# > DesignPattern' 카테고리의 다른 글
DesignPattern - 이벤트 버스(Event Bus) 패턴 (0) | 2025.08.06 |
---|---|
DesignPattern - 팩토리(Factory) 패턴 (1) | 2025.08.06 |
DesignPattern - Unity에서의 Generic Singleton 패턴 (0) | 2025.07.22 |
DesignPattern - Singleton Pattern (싱글톤 패턴) in Unity (0) | 2025.07.22 |
DesignPattern - Adapter Pattern(어댑터 패턴) + 예제 (1) | 2025.07.04 |