상황
CMS 할 때 WidgetBP의 버튼을 클릭하면 Call 하는 event dispatcher를쓰고 , player controller의 begin play에서 버튼 바인딩을 한번 한다음에 custom event를 만들어서 기능을 바인딩을 해주었다
이렇게 하면 뭐가 문제가 되냐면, 동그라미 친 Call On Finish Button Clicked라는 이벤트디스페처를 더블클릭했을 때, 함수 안으로 들어가지도 않고 안눌러져서 디버깅이 어렵고, Find Reference를 눌러야만 알 수 있다는 것. 또 이벤트 디스패처는 여러곳에서 Binding 할 수 있기 때문에 디버깅이 특히 어렵다. Bind 되는 게 다 잡히니까!
그럼 어떻게 하는게 정석이냐 하면
(캐스팅해서) 함수를 불러주자. 함수든 이벤트든.
어떻게든 구현만 되는게 중요한 게 아니라, 상황에 맞게 쓰는 것이 중요하다.
나 편하자고 Event Dispatcher를 남발했지만, 다른 사람이 볼 경우나 시간이 흐른 내가 봤을 때 왜 이걸 썼는지 이해하기 힘들다.
그렇다면 Event Dispatcher를 써야 하는 상황과 쓰지 말아야 할 상황은 언제인가?
Event Dispatcher를 써야 하는 경우
- 객체 간 느슨한 결합이 필요한 경우:
- 서로 다른 객체가 서로의 구체적인 타입을 알 필요 없이 상호작용해야 할 때 사용됩니다. 이는 객체 간 결합도를 낮추고, 코드의 유연성과 재사용성을 높입니다.
- 상황: 플레이어가 특정 구역에 들어갈 때 여러 시스템(예: 음악 재생, 조명 조정 등)이 반응해야 합니다.
- 구현:
- 플레이어 블루프린트에서 OnEnterZone이라는 Event Dispatcher를 생성합니다.
- 음악 시스템, 조명 시스템 등은 이 Event Dispatcher를 구독하여, 플레이어가 구역에 들어오면 각각의 작업(음악 재생, 조명 변화)을 실행합니다.
- 이 방식은 플레이어와 음악, 조명 시스템 간의 결합을 최소화하여, 코드가 더 유연해지고 확장 가능해집니다.
- 여러 객체가 같은 이벤트에 반응해야 할 때:
- 하나의 이벤트가 발생했을 때 여러 객체가 그 이벤트에 대해 반응해야 하는 상황에서 사용됩니다.
- 상황: 문을 열 때 여러 트리거(예: 사운드, 애니메이션, 로그 메시지)가 동시에 실행되어야 하는 경우.
- 구현:
- 문 블루프린트에서 OnDoorOpened라는 Event Dispatcher를 생성합니다.
- 문이 열릴 때 이 Event Dispatcher를 호출하여 여러 구독자(사운드, 애니메이션, 로그)가 동시에 반응하게 합니다.
- 이 방식은 이벤트 기반의 통합된 처리를 가능하게 합니다.
- 거의 정해진 게 없을 때
- Binding될 시스템이 명확하게 정해지지 않았을 때 쓴다
- 근데 쓰는 경우는 거의 없다고 봄
Event Dispatcher를 쓰지 말아야 하는 경우
- 단순한 함수 호출이나 직접 상호작용이 가능한 경우:
- 만약 객체가 다른 객체와 직접 상호작용해야 하거나, 단순히 함수 하나를 호출하는 것만으로도 충분한 경우, Event Dispatcher는 과도한 사용이 될 수 있습니다.
- 상황: 플레이어가 버튼을 눌렀을 때 문을 여는 상황.
- 구현:
- 여기서는 Event Dispatcher 대신, 버튼이 직접 문을 참조하고 문을 여는 함수를 호출하는 것이 더 간단하고 적절합니다.
- Event Dispatcher를 사용하면 코드가 더 복잡해질 수 있으며, 이 경우에는 오히려 객체 간의 간단한 상호작용을 위해 불필요한 복잡성을 추가하는 것이 됩니다.
- 단순한 상호작용에는 직접적인 함수 호출이 더 직관적이고, 코드의 가독성도 더 좋습니다.
- Event Dispatcher는 필요 이상으로 복잡성을 더할 수 있으며, 이를 사용하는 개발자에게 더 많은 오버헤드를 줄 수 있습니다.
- 일회성 상호작용이나 명확한 객체 간 관계가 있는 경우:
- 특정 이벤트가 한 번만 발생하고, 그 이벤트에 대해 명확한 객체가 반응해야 할 때는 Event Dispatcher를 사용하는 것이 과도할 수 있습니다.
- 상황: 게임 시작 시 UI를 초기화하고, 메뉴 화면을 띄우는 경우.
- 구현:
- 이 경우 Event Dispatcher를 사용하기보다는, 게임 모드나 컨트롤러에서 직접 UI 초기화 함수를 호출하는 것이 더 간단하고 효율적입니다.
- 일회성 상호작용에서는 Event Dispatcher가 필요 이상으로 복잡해질 수 있습니다.
- 일회성 이벤트에는 Event Dispatcher를 사용하기보다는 간단한 함수 호출이 더 적합합니다.
- Event Dispatcher는 다수의 이벤트 리스너가 필요하거나, 이벤트가 여러 번 발생해야 하는 경우에만 그 가치가 있습니다.
결론
- Event Dispatcher를 사용해야 하는 경우:
- 객체 간 느슨한 결합이 필요할 때.
- 하나의 이벤트에 여러 객체가 반응해야 할 때.
- 코드의 확장성과 유연성을 높이고 싶을 때.
- Event Dispatcher를 사용하지 말아야 하는 경우:
- 단순한 함수 호출이나 직접 상호작용이 충분한 경우.
- 명확한 객체 간 관계가 있어 직접 함수 호출이 가능한 경우.
- 불필요한 복잡성을 피하고 싶을 때.
Delegate가 뭐지?
Delegate의 사전적 의미는 '위임하다'
처리하고 싶은 내용이 있는데 이것을 내가 처리하지 않고 다른 객체가 처리하도록 위임한다고 보면 된다
예를 들어 적을 공격해서 맞춘 상황을 생각해보면,
내가 직접 적의 피를 흘리게 하고, 적의 체력을 감소시키고, 체력이 다했으면 죽이도록 할 수 있따.
그런데 실제 상황이라면 나는 공격만 할 수 있고,
피격 당한 상대방이 스스로 피를 흘리고, 체력이 떨어지고, 체력이 다하면 죽는다.
이처럼 내가 공격하긴 했는데 내가 상대방의 상태까지도 다 처리하기에는 난처하다. 이 떄 상대방이 스스로 피격 처리를 하도록 델리게이트를 이용해 위임할 수 있다.
'Unreal' 카테고리의 다른 글
[Unreal] Bone, Socket (0) | 2024.10.15 |
---|---|
FRunnable Class (0) | 2024.10.02 |
[Unreal] Multiplayer Game Study (0) | 2024.07.04 |
[Unreal] 부모 객체의 스케일 변경이 자식 객체의 위치에 영향을 준다 (0) | 2024.06.07 |
[Unreal] Custom Event vs Create Event (0) | 2024.06.05 |
댓글