icon안동민 개발노트

이벤트 디스패처의 기본 사용법


 이벤트 디스패처는 블루프린트 간에 느슨하게 결합된 통신을 가능하게 하는 강력한 메커니즘입니다.

 이를 통해 한 블루프린트에서 이벤트를 발생시키고, 다른 블루프린트에서 이에 반응할 수 있습니다.

이벤트 디스패처의 개념

  • 정의 : 이벤트 디스패처는 특정 상황이 발생했음을 여러 리스너에게 알리는 메커니즘입니다.
  • 목적 : 블루프린트 간의 느슨한 결합을 구현하여 모듈성과 확장성을 향상시킵니다.
  • 작동 방식 : 발신자(dispatcher)가 이벤트를 발생시키면, 이에 바인딩된 모든 수신자(listener)가 반응합니다.

이벤트 디스패처 생성 방법

  1. 블루프린트 에디터의 'My Blueprint' 패널에서 '추가' 버튼 클릭
  2. 'Event Dispatcher' 선택
  3. 이벤트 디스패처의 이름 지정 (예 : OnHealthChanged)
  4. 필요한 경우 매개변수 추가

느슨한 결합 구현

 이벤트 디스패처를 사용하면 블루프린트 간의 직접적인 참조 없이 통신할 수 있습니다.

 예제 : 체력 변경 시스템

Blueprint: BP_Character
Event Dispatcher: OnHealthChanged(NewHealth: Float)
 
Blueprint: BP_UI_HealthBar
Function: UpdateHealthBar(NewHealth: Float)
 
Blueprint: BP_GameMode
Event BeginPlay:
[Get Player Character] --> [Cast To BP_Character]
                              |
[Bind Event to OnHealthChanged] --> [UpdateHealthBar]

 이 예제에서 캐릭터 블루프린트는 UI나 게임 모드를 직접 참조하지 않고도 체력 변경 정보를 전달할 수 있습니다.

이벤트 바인딩과 언바인딩

 바인딩 과정

  1. 이벤트를 수신할 블루프린트에서 바인딩 노드 생성
  2. 대상 액터(이벤트 발신자) 선택
  3. 바인딩할 이벤트 디스패처 선택
  4. 이벤트 발생 시 실행할 함수 연결

 언바인딩 과정

  1. 'Unbind Event' 노드 사용
  2. 바인딩과 동일한 대상과 이벤트 디스패처 선택

이벤트 발생(Broadcast)

 이벤트 발생은 이벤트 디스패처를 소유한 블루프린트에서 수행합니다.

 방법

  1. 'Call' 노드 사용
  2. 필요한 경우 매개변수 값 설정

 예 : 데미지 처리 후 체력 변경 이벤트 발생

Function: TakeDamage
[Reduce Health] --> [Check Health <= 0]
                        |
      [Call OnHealthChanged] <-- [False]
                        |
         [Call OnDeath] <-- [True]

효과적인 통신 패턴

 1. 상태 변경 알림

  • 중요한 상태 변화 시 이벤트 발생
  • 예 : 플레이어 상태, 게임 단계 변경

 2. 시스템 간 통신

  • 직접적인 참조 없이 시스템 간 정보 교환
  • 예 : 인벤토리 시스템과 UI 업데이트

 3. 멀티캐스트 알림

  • 여러 리스너에게 동시에 정보 전달
  • 예 : 글로벌 게임 이벤트 알림

 4. 조건부 실행

  • 특정 조건 충족 시에만 이벤트 발생
[Check Condition] --> [Branch]
                        |
   [Call Event Dispatcher] <-- [True]

주의해야 할 점

 1. 성능 고려

  • 과도한 이벤트 발생은 성능 저하 가능
  • 필요한 경우에만 이벤트 발생 및 바인딩

 2. 정리 (Cleanup)

  • 불필요해진 바인딩은 반드시 언바인딩
  • 특히 객체 파괴 시 주의

 3. 순환 호출 방지

  • 이벤트 핸들러 내에서 같은 이벤트 재발생 주의

 4. 널 체크

  • 이벤트 발생 전 발신자 유효성 확인

 5. 디버깅

  • 복잡한 이벤트 체인 추적을 위한 로깅 활용

예제 : 퀘스트 시스템

Blueprint: BP_QuestManager
Event Dispatchers:
  - OnQuestStarted(QuestID: Integer)
  - OnQuestCompleted(QuestID: Integer)
  - OnQuestFailed(QuestID: Integer)
 
Function: StartQuest
[Check Quest Conditions] --> [Branch]
                               |
      [Call OnQuestStarted] <-- [True]
                               |
    [Notify Player of Failure] <-- [False]
 
Blueprint: BP_UI_QuestLog
Event BeginPlay:
[Get Quest Manager] --> [Bind OnQuestStarted to UpdateQuestLog]
                    --> [Bind OnQuestCompleted to UpdateQuestLog]
                    --> [Bind OnQuestFailed to UpdateQuestLog]
 
Function: UpdateQuestLog
[Get Quest Info] --> [Update UI Elements]
 
Blueprint: BP_GameMode
Event BeginPlay:
[Get Quest Manager] --> [Bind OnQuestCompleted to CheckGameProgress]
 
Function: CheckGameProgress
[Count Completed Quests] --> [Check Against Total Quests]
                                |
                  [Trigger Game Ending] <-- [All Completed]

 이 예제에서 퀘스트 매니저는 다양한 퀘스트 관련 이벤트를 발생시키고, UI와 게임 모드는 이에 반응합니다.

 이를 통해 각 시스템은 독립적으로 작동하면서도 효과적으로 통신할 수 있습니다.

 이벤트 디스패처는 블루프린트 간 통신을 유연하고 확장 가능하게 만드는 강력한 도구입니다.

 직접 참조 없이도 복잡한 상호작용을 구현할 수 있어, 대규모 프로젝트에서 유용합니다.