본문 바로가기
개발/게임 디자인 패턴

게임 디자인 패턴 16. 이벤트 버스 패턴 (Event Bus Pattern)

by 석시 2023. 11. 14.



이벤트 버스 패턴은 이벤트의 게시와 구독을 연결하는 방법을 제시하는 디자인 패턴이다.

우리는 이러한 이벤트 버스 패턴을 추상화하여 이벤트 게시자와 구독자가 서로를 전혀 알지 못하도록 구현해볼 것이다.


이벤트 버스 구현해보기

레이싱 게임 프로젝트에서 이벤트 버스를 구현한다고 해보자.

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);
}


이벤트 버스를 언제 사용해야하는가?

전역으로 구독이 가능한 이벤트를 구현해야 할 때 매우 유용하다.

오브젝트끼리 서로만 게시 구독 관계를 가지거나 할 때는 굳이 전역으로 이벤트 버스를 선언해주는 것이 좋지 못하다.

게임의 전체적인 로직 등을 전역적으로 관리해주고 싶을 때 이벤트 버스를 사용하는 것이 좋겠다.

대안으로 사용할 수 있는 것을 소개하겠다.

옵저버 패턴 : 오브젝트의 상태 변경을 구독자들에게 알리는 패턴이다.

이벤트 큐 패턴 : 게시자가 보낸 메시지를 구독자에게 원하는 시간에 보내도록 하고 싶을 때 사용할 수 있다.

게임 디자인 패턴 11. 이벤트 큐 (Event Queue) 패턴
이벤트 vs 메시지이벤트 ‘큐’를 쓰는 이유가?디자인 요소 이벤트 큐 패턴이다. 왜 이벤트에 큐를 사용하지? 라는 의문이 들 수 있다.그것을 지금부터 설명해보고자 한다. 이벤트 vs 메시지 일단 모든 것을 설명하기 앞서 가장 먼저 짚고 넘어가야 할 것 중 하나다.생각보다 이벤트와 메시지를 구분하지 못하는 경우가 많다. 정리하자면 이렇다.이벤트는 이미 일어난 사건이다. 몬스터가 죽었거나, 투사체에 맞았거나 하는 등의 사건이 이벤트가 되겠다. 즉, 이 이벤트를 복수의 리스너가 들을 수 있도록 구현할수도 있는 것이다. 메시지는 받는 사람이 했으면 하는 행동을 표현한 것이다. 경험치를 얻는다던지, 사운드를 재생한다던지 등의 표현이 메시지가 되는 것이다. 보통은 리스너가 하나다. 여러 리스너가 하도록 구현할 수도..
https://seoksii.tistory.com/78

스크립터블 오브젝트 : 스크립터블 오브젝트로도 이벤트 시스템을 만들 수 있다.

Unity 스크립터블 오브젝트로 이벤트 시스템 만들기
스크립터블 오브젝트의 사용 방법 중 스크립터블 오브젝트로 이벤트 시스템을 만들어 관리할 수 있는 방법이 있어서 정리하고자 한다. 기본적으로 다음과 같이 선언한다.[CreateAssetMenu(fileName = "EventSO", menuName = "Scriptable Object/EventSO")] public class EventSO : ScriptableObject { private List listners = new List(); public void Subscribe(EventListener listener) { listeners.Add(listener); } public void Unsubscribe(EventListener listener) { listeners.Remove(listener..
https://seoksii.tistory.com/85


Uploaded by N2T