๋ฐ์ํ
๐ก Unity ๋์์ธ ํจํด - ์ด๋ฒคํธ ๋ฒ์ค(Event Bus) ํจํด
1. ์ด๋ฒคํธ ๋ฒ์ค๋?
์ด๋ฒคํธ ๋ฒ์ค(Event Bus) ํจํด์ ๊ฐ์ฒด ๊ฐ ์ง์ ์ ์ธ ์ฐธ์กฐ ์์ด, ์ ์ญ ์ด๋ฒคํธ ํ๋ธ๋ฅผ ํตํด ๋ฉ์์ง๋ฅผ ์ฃผ๊ณ ๋ฐ๋ ๊ตฌ์กฐ์ ๋๋ค.
"A๊ฐ B๋ฅผ ์ง์ ์์ง ๋ชปํด๋, ์ด๋ฒคํธ ๋ฒ์ค๋ฅผ ํตํด ์ํตํ ์ ์๋ ๊ตฌ์กฐ"์ ๋๋ค.
Unity์์๋ UI, ๊ฒ์ ๋ก์ง, ์์คํ ๊ฐ ๋์จํ ์ฐ๊ฒฐ(Decoupling) ์ด ํ์ํ ๋ ๋งค์ฐ ์ ์ฉํฉ๋๋ค.
2. ์ธ์ ์ฌ์ฉํ๋์?
- ์์คํ ๊ฐ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ๊ณ ์ถ์ ๋
- ์ฌ๋ฌ UI/์ค๋ธ์ ํธ๊ฐ ๋์ผํ ์ด๋ฒคํธ๋ฅผ ๊ตฌ๋ ํด์ผ ํ ๋
- ํน์ ์ด๋ฒคํธ์ ๋ฐ์ํ๋ ๋์์ด ์์ฃผ ๋ฐ๋๊ฑฐ๋ ๋ง์ ๋
3. ๊ตฌ์กฐ ์ค๋ช
- Publisher (๋ฐํ์): ์ด๋ฒคํธ๋ฅผ ์ ์กํจ
- Subscriber (๊ตฌ๋ ์): ํน์ ์ด๋ฒคํธ๋ฅผ ๋ฃ๊ณ ๋ฐ์ํจ
- EventBus: ์ค์ฌ์ ์ญํ . ๋ชจ๋ ์ด๋ฒคํธ๋ฅผ ๊ด๋ฆฌํ๊ณ ์ ๋ฌํจ
4. Unity ์์ : ํ๋ ์ด์ด๊ฐ ์์ดํ ์ ๋จน์์ ๋ UI ์ ๋ฐ์ดํธ
๐ง Step 1: EventBus ํด๋์ค
using System;
using System.Collections.Generic;
public static class EventBus
{
private static Dictionary<string, Action<object>> eventTable = new();
public static void Subscribe(string key, Action<object> callback)
{
if (!eventTable.ContainsKey(key))
eventTable[key] = delegate { };
eventTable[key] += callback;
}
public static void Unsubscribe(string key, Action<object> callback)
{
if (eventTable.ContainsKey(key))
eventTable[key] -= callback;
}
public static void Publish(string key, object data = null)
{
if (eventTable.TryGetValue(key, out var callback))
callback.Invoke(data);
}
}
๐ฎ Step 2: Player์์ ์์ดํ ํ๋ ์ ์ด๋ฒคํธ ๋ฐํ
using UnityEngine;
public class Player : MonoBehaviour
{
private void Update()
{
if (Input.GetKeyDown(KeyCode.E))
{
Debug.Log("ํ๋ ์ด์ด๊ฐ ์์ดํ
์ ํ๋!");
EventBus.Publish("ItemPicked", "HealthPotion");
}
}
}
๐ผ๏ธ Step 3: UI๊ฐ ์ด๋ฒคํธ๋ฅผ ๊ตฌ๋ ํ์ฌ ํ์
using UnityEngine;
using TMPro;
public class ItemUI : MonoBehaviour
{
[SerializeField] private TextMeshProUGUI itemText;
private void OnEnable()
{
EventBus.Subscribe("ItemPicked", OnItemPicked);
}
private void OnDisable()
{
EventBus.Unsubscribe("ItemPicked", OnItemPicked);
}
private void OnItemPicked(object itemName)
{
itemText.text = $"ํ๋ํ ์์ดํ
: {itemName}";
}
}
5. ์ฅ์ ๊ณผ ๋จ์
โ ์ฅ์
- ์์ ํ ๋์จํ ๊ฒฐํฉ
- ์ฌ๋ฌ ์ค๋ธ์ ํธ๊ฐ ํ๋์ ์ด๋ฒคํธ์ ๋ฐ์ ๊ฐ๋ฅ
- ๋ฐํ์์ ๊ตฌ๋ ์๊ฐ ์๋ก ๋ชฐ๋ผ๋ ๋จ → ํ์ฅ์ฑ↑
โ ๋จ์
- ์คํ ํ๋ฆ์ด ๋ช ํํ์ง ์์ → ๋๋ฒ๊น ์ด๋ ค์
- ์๋ชป๋ ์ด๋ฒคํธ ํค ์ ๋ ฅ ์ ๋ฐํ์ ์ค๋ฅ ์ ๋ฐ ๊ฐ๋ฅ
โ ๋ง๋ฌด๋ฆฌ ํ ์ค ์์ฝ
์ด๋ฒคํธ ๋ฒ์ค๋ "๋ง๋ง ํ๋ฉด ๋๊ตฌ๋ ๋ค์ ์ ์๋ ๋ง์ดํฌ" ๊ฐ์ ๊ตฌ์กฐ๋ก, Unity ํ๋ก์ ํธ์ ๋ณต์ก๋๋ฅผ ๋ฎ์ถ๋ ๊ฐ๋ ฅํ ๋๊ตฌ์ ๋๋ค.
๋ฐ์ํ
'C# > DesignPattern' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
DesignPattern - ์ปค๋งจ๋(Command) ํจํด (0) | 2025.08.06 |
---|---|
DesignPattern - ์ํ ํจํด(State Pattern) vs FSM (2) | 2025.08.06 |
DesignPattern - ํฉํ ๋ฆฌ(Factory) ํจํด (1) | 2025.08.06 |
DesignPattern - ์ต์ ๋ฒ(Observer) ํจํด (0) | 2025.08.06 |
DesignPattern - Unity์์์ Generic Singleton ํจํด (0) | 2025.07.22 |