개발/게임 디자인 패턴
게임 디자인 패턴 16. 이벤트 버스 패턴 (Event Bus Pattern)
석시
2023. 11. 14. 23:31
이벤트 버스 패턴은 이벤트의 게시와 구독을 연결하는 방법을 제시하는 디자인 패턴이다.
우리는 이러한 이벤트 버스 패턴을 추상화하여 이벤트 게시자와 구독자가 서로를 전혀 알지 못하도록 구현해볼 것이다.
이벤트 버스 구현해보기
레이싱 게임 프로젝트에서 이벤트 버스를 구현한다고 해보자.
public enum RaceEventType
{
COUNTDOWN, START, RESTART, PAUSE, STOP, FINISH, QUIT
}
다음과 같이 enum을 선언 후 이벤트 버스 클래스를 작성한다.
using System.Collections.Generic;
using UnityEngine.Events;
public class RaceEventBus
{
private static readonly IDictionary<RaceEventType, UnityEvent>
Events = new Dictionary<RaceEventType, UnityEvent>();
public static void SubScribe(RaceEventType eventType, UnityAction listener)
{
UnityEvent thisEvent;
if (Events.TryGetValue(eventType, out thisEvent))
thisEvent.AddListener(listener);
else
{
thisEvent = new UnityEvent();
thisEvent.AddListener(listener);
Events.Add(eventType, thisEvent);
}
}
public static void Unsubscribe(RaceEventType type, UnityAction listener)
{
UnityEvent thisEvent;
if (Events.TryGetValue(type, out thisEvent))
thisEvent.RemoveListener(listener);
}
public static void Publish(RaceEventType type)
{
UnityEvent thisEvent;
if (Events.TryGetValue(type, out thisEvent))
thisEvent.Invoke();
}
}
그 후 구독은 다음과 같은 방식으로 해준다.
void OnEnable()
{
RaceEventBus.Subscribe(RaceEventType.COUNTDOWN, StartTimer);
}
void OnDisable()
{
RaceEventBus.Unsubscribe(RaceEventType.COUNTDOWN, StartTimer);
}
이벤트 버스를 언제 사용해야하는가?
전역으로 구독이 가능한 이벤트를 구현해야 할 때 매우 유용하다.
오브젝트끼리 서로만 게시 구독 관계를 가지거나 할 때는 굳이 전역으로 이벤트 버스를 선언해주는 것이 좋지 못하다.
게임의 전체적인 로직 등을 전역적으로 관리해주고 싶을 때 이벤트 버스를 사용하는 것이 좋겠다.
대안으로 사용할 수 있는 것을 소개하겠다.
옵저버 패턴 : 오브젝트의 상태 변경을 구독자들에게 알리는 패턴이다.
이벤트 큐 패턴 : 게시자가 보낸 메시지를 구독자에게 원하는 시간에 보내도록 하고 싶을 때 사용할 수 있다.
스크립터블 오브젝트 : 스크립터블 오브젝트로도 이벤트 시스템을 만들 수 있다.
Uploaded by N2T