[2025_11_11]EventBus패턴

2025. 11. 11. 22:00TIL

1. 오늘 한 일

  • EventBus 패턴 도입 및 입력 이벤트 구조 리팩토링

2. 작업 목적

프로젝트 전반에서 외부의 이벤트 전달 구조를 깔끔하게 관리하기 위해
EventBus 패턴을 도입했다.
이 방식은 시스템 간 결합도를 낮추고,
입력·로직·UI 간의 의존성을 줄이기 위한 선택이다.


3. EventBus 패턴이란?

EventBus는 이벤트를 중앙에서 관리하고
다른 스크립트들이 이벤트를 구독(Subscribe) 또는
발행(Publish) 하도록 하는 구조이다.

이를 통해 서로 다른 시스템이 직접 참조 없이도 통신할 수 있다.

4. 예시 구조

public static class EventBus
{
    public static event Action OnPlayerJump;
    public static event Action<int> OnScoreChanged;

    public static void RaisePlayerJump() => OnPlayerJump?.Invoke();
    public static void RaiseScoreChanged(int score) => OnScoreChanged?.Invoke();
}

5. 사용 예시

// 점프 입력 감지
if (Input.GetKeyDown(KeyCode.Space))
{
    player.Jump();
    EventBus.RaisePlayerJump();
}

// 다른 스크립트에서
private void OnEnable()
{
    EventBus.OnPlayerJump += PlayJumpSound;
}

private void OnDisable()
{
    EventBus.OnPlayerJump -= PlayJumpSound;
}

→ 이렇게 하면 플레이어, UI, 사운드 매니저 등이
서로 직접 참조 없이 이벤트만으로 호출 가능하다.
즉, 최소한의 의존성(낮은 결합도) 을 유지하면서
프로젝트 전반의 이벤트 흐름을 깔끔하게 관리할 수 있다.


 실제 프로젝트 적용 코드

public static class EventBus 
{
    // 플레이어 입력 이벤트
    public static Action OnPlayerJumpRequested;
    public static Action OnPlayerAttackRequested;
    public static Action OnPlayerInteractRequested;
    public static Action<bool> OnPlayerSprintRequested;
    public static Action<bool> OnPlayerZoomRequested;
    public static Action OnInventoryRequested;
    public static Action OnInteractionCompleted;

    // 플레이어 상태 이벤트
    public static Action OnPlayerJumped;
    public static Action OnPlayerLanded;
    public static Action OnPlayerDead;
    public static Action OnWeaponFired;
    public static Action OnPlayerRespawned;
    public static Action OnSpChanged;
}
 

 입력 매니저 내 이벤트 트리거 예시

private void OnJump(InputAction.CallbackContext context)
{
    if (player.isDead || !context.performed)
        return;

    EventBus.OnPlayerJumpRequested?.Invoke();
}

 배운 점

  • EventBus 패턴을 통해 입력 시스템과 로직, UI, 사운드 등을 완전히 분리할 수 있었다.
  • 결합도 감소, 확장성 향상, 유지보수 용이라는 세 가지 핵심 이점을 실감함.
  • 앞으로 새로운 기능을 추가할 때도 EventBus 구독만으로 손쉽게 이벤트 반응을 구현할 수 있다.