๋ฐ์ํ
๐ญ 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 |