발행자 수 | 구독자 수 | 대응 방식 |
---|---|---|
1 | 1 | 함수 호출 |
1 | can be N | 옵저버 패턴 |
can be N | can be N | 이벤트 버스 패턴 |
// 발행자
public class Publisher : MonoBehaviour
{
public event Action OnEvent;
// 생략
}
// 구독자
public class Subscriber : MonoBehaviour
{
public Publisher pub;
void Start()
{
pub.OnEvent += EventCall;
}
void EventCall()
{
// ~
}
}
using System;
using System.Collections.Generic;
using UnityEngine;
public enum QuestEvent
{
Hunt,
Explore,
Build
}
public static class QuestEventBus
{
// 접근성을 위해서 static 사용
static Dictionary<QuestEvent, Action> questEventMap = new Dictionary<QuestEvent, Action>();
// 등록
public static void Subscribe(QuestEvent questEvent, Action listener)
{
if (questEventMap.TryGetValue(questEvent, out Action questAction))
{
questAction += listener;
questEventMap[questEvent] = listener;
}
else
{
questAction = listener;
questEventMap.Add(questEvent, questAction);
}
}
// 해제
public static void Unsubscribe(QuestEvent questEvent, Action listener)
{
if (questEventMap.TryGetValue(questEvent, out Action questAction))
{
questAction -= listener;
if(questAction == null)
{
questEventMap.Remove(questEvent);
}
else
{
questEventMap[questEvent] = listener;
}
}
}
public static void Publish(QuestEvent questEvent)
{
if (questEventMap.TryGetValue(questEvent, out Action questAction))
{
questAction?.Invoke();
}
}
}
// 사용 예시
public class QuestListener : MonoBehaviour
{
[SerializeField] QuestEvent questType = QuestEvent.Hunt;
void OnEnable()
{
QuestEventBus.Subscribe(questType, Test);
}
void OnDisable()
{
QuestEventBus.Unsubscribe(questType, Test);
}
void Test()
{
Debug.Log("Listener Test called");
}
}
public class QuestPublisher : MonoBehaviour
{
public void OnDead()
{
QuestEventBus.Publish(QuestEvent.Hunt);
}
}
#내일배움캠프 #스파르타내일배움캠프 #스파르타내일배움캠프TIL