나만의 작은 도서관

[TIL][C++] 250904 MMO 서버 개발 94일차: [언리얼] 이벤트 바인드는 BP 함수에서 할 수 없다. 본문

Today I Learn

[TIL][C++] 250904 MMO 서버 개발 94일차: [언리얼] 이벤트 바인드는 BP 함수에서 할 수 없다.

pledge24 2025. 9. 5. 16:47
주의사항: 해당 글은 일기와 같은 기록용으로, 다듬지 않은 날것 그대로인 글입니다. 

[언리얼] 이벤트 바인드는 BP 함수에서 할 수 없다.

  • 인벤토리를 만들던 도중 슬롯에서 발생한 더블 클릭/오른쪽 마우스 클릭 이벤트를 바인드하기 위해 인벤토리 BP에서 만든 함수 내부에서 바인드 하려고 하니 바인드를 막는 것을 발견했다. 문법상 잘못된 게 없음에도 막는걸 보아하니 일부러 막았나? 싶어 찾아보니까 일부러 막은 게 맞았다. 이유는 아래와 같았다.

언리얼에서 이벤트 디스패처에 대한 바인딩을 막은 이유

 

이유 1. 함수는 동기 실행 단위

  • 블루프린트에서 제작한 함수는 동기 방식으로 진행된다. 그런데 동기 방식으로 진행되는 함수에서 이벤트 바인딩과 같은 “비동기적-지속적 연결”을 허용하면, 함수의 실행 수명과 이벤트 연결의 수명이 충돌하게 된다. 언리얼은 이러한 충돌을 막기 위해 일부러 함수내 이벤트 바인딩을 금지하였다.

 

이유 2. 노드 그래프 일관성 유지

  • 언리얼에서는 함수 그래프의 이벤트 그래프를 명확히 분리하고자 한다. 이벤트 그래프의 흐름은 비동기적-지속적 연결만을, 함수는 입력→출력 변환만을 하도록 설계했기 때문에 이유 1과 비슷한 이유로 일관성을 유지하기 위해 혼합 사용을 막았다.

 

이유 3. 메모리 관리 문제

  • 이벤트 바인딩은 메모리 참조와 델리게이트 등록을 남긴다. 그런데 함수에게 이벤트 바인딩을 허용하면 호출 시마다 같은 바인딩을 여러 번 할 수 있는 위험성이 잠재적으로 존재하게 된다.
  • 같은 이벤트를 여러 번 바인딩하는 것 자체가 문제이기도 하지만 언바인드 타이밍 관리도 꼬여버리기 때문에 엔진 레벨에서 방지를 해두는 것이다.

 

결론

  • 언리얼이 함수 내부에서 이벤트 디스패처에 대한 이벤트 바인딩을 막은 이유는 1) 여러 번 같은 이벤트를 바인딩하는 상황을 막기 위해, 2) 입력→출력 흐름을 가지는 함수와 비동기적-지속적 연결 흐름을 가지는 이벤트를 서로 다른 그래프에서 진행되도록 명확히 분리하고자 하기 위해서이다.
  • owner 위치의 위젯이 owned 위젯의 이벤트를 바인딩하고 싶다면, 이벤트 노드에서 바인드해야한다. 추천하는 이벤트 종류는 아래와 같다.
    • BeginPlay 노드
    • 커스텀 이벤트
    • 생성자(Construction Script)