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]
이벤트 발생(Broadcast) 예시

효과적인 통신 패턴

  1. 상태 변경 알림
  • 중요한 상태 변화 시 이벤트 발생
  • 예 : 플레이어 상태, 게임 단계 변경
  1. 시스템 간 통신
  • 직접적인 참조 없이 시스템 간 정보 교환
  • 예 : 인벤토리 시스템과 UI 업데이트
  1. 멀티캐스트 알림
  • 여러 리스너에게 동시에 정보 전달
  • 예 : 글로벌 게임 이벤트 알림
  1. 조건부 실행
  • 특정 조건 충족 시에만 이벤트 발생
[Check Condition] --> [Branch]
                        |
   [Call Event Dispatcher] <-- [True]

주의해야 할 점

  1. 성능 고려
  • 과도한 이벤트 발생은 성능 저하 가능
  • 필요한 경우에만 이벤트 발생 및 바인딩
  1. 정리 (Cleanup)
  • 불필요해진 바인딩은 반드시 언바인딩
  • 특히 객체 파괴 시 주의
  1. 순환 호출 방지
  • 이벤트 핸들러 내에서 같은 이벤트 재발생 주의
  1. 널 체크
  • 이벤트 발생 전 발신자 유효성 확인
  1. 디버깅
  • 복잡한 이벤트 체인 추적을 위한 로깅 활용

예제 : 퀘스트 시스템

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와 게임 모드는 이에 반응합니다. 이를 통해 각 시스템은 독립적으로 작동하면서도 효과적으로 통신할 수 있습니다.

 이벤트 디스패처는 블루프린트 간 통신을 유연하고 확장 가능하게 만드는 강력한 도구입니다. 직접 참조 없이도 복잡한 상호작용을 구현할 수 있어, 대규모 프로젝트에서 특히 유용합니다. 그러나 과도한 사용은 로직 추적을 어렵게 만들 수 있으므로, 적절한 균형을 유지하는 것이 중요합니다. 이벤트 기반 아키텍처를 설계할 때는 전체 시스템의 구조와 흐름을 신중히 고려해야 하며, 필요에 따라 다른 통신 방식과 조합하여 사용하는 것이 좋습니다.