[UE5] 이득우 Part 1. 9강 언리얼 C++Ⅲ - 델리게이트

공부 스파이럴·2023년 12월 12일
0

강한 결합(Tight Coupling)과 느슨한 결합(Loose Coupling)

  • 강한 결합
    • 클래스들이 서로 의존성을 가지는 경우
    • 새로운 기능이 생긴다면?
      • 부모나 자식을 고치게 되면 다 고쳐야할 수도 있음
  • 느슨한 결합
    • DIP 원칙: 실물에 의존하지 말고 추상적 설계에 의존
    • 필요한 기능에 대한 추상적인 설계
    • 인터페이스를 선언해 해결
    • 느슨한 결합 구조는 유지 보수를 쉽게 해줌

델리게이트

  • 함수를 오브젝트처럼 관리
  • callback이나 std::function이 있지만 복잡하고 활용이 느림
  • C#의 델리게이트처럼 언리얼도 델리게이트 지원

https://docs.unrealengine.com/5.3/ko/delegates-and-lamba-functions-in-unreal-engine/

  • 어떤 객체가 가지고 있는 멤버 함수와 delegate를 연결해서 느슨한 결합을 만들 수 있음
  • 델리게이트 오브젝트는 복사해도 완벽히 안전
  • 가급적이면 델리게이트는 참조 전달

  • 선언 방법

  • 매크로 제공
    • 일대일, 일대다, 저장할 것, 블루프린트 연동 등에 대한 매크로

  • 델리게이트 바인딩
    • 선언한 델리게이트를 멤버함수, 일반함수, 정적함수 등 다양한 함수와 연결해주는 함수

  • 페이로드 데이터
    • 묶는 객체에 대한 정보를 지정해서 하나의 구문으로 편하게 묶을 수 있다는 것을 의미

  • 델리게이트 실행
    • execute()를 통해서 호출
    • broadcast()로 일대다 호출도 가능

발행 구독 디자인 패턴

  • 푸시(Push) 형태의 알림을 구현한느데 적합한 디자인 패턴
  • 발행자(Publisher)와 구독자(Subscriber)로 구분
    • 콘텐츠 제작자는 콘텐츠 생산
    • 발행자는 콘텐츠를 배포
    • 구독자는 배포된 콘텐츠를 받아 소비
    • 제작자와 구독자가 서로 몰라도, 발행자를 통해 콘텐츠를 생산하고 전달할 수 있음(느슨한 결합)
  • 발행 구독 디자인 패턴 장점
    • 서로를 몰라 느슨한 결합
    • 유지 보수가 쉬움
    • 유연함
    • 테스트 쉬워짐
    • 시스템 스케일 조절 가능
    • 기능 확장 용이

실습 예제

  • CourseInfo와 Student
    • 학교는 학사 정보 관리
    • 학사 정보가 변경되면 자동으로 학생에게 알림
    • 학생은 학사 정보 알림 구독 해지 가능

언리얼 델리게이트 선언

고려사항

  • 어떤 데이터를 전달하고 받을 것인가
    • 몇 개의 인자
    • 어떤 방식으로 전달
    • 일대일? 일대다?
  • 프로그래밍 환경 설정
    • C++ 프로그래밍만?
    • UFUNTION으로 지정된 블루프린트 함수 사용?
  • 어떤 함수와 연결
    • 클래스 외부에 설계된 C++ 함수와 연결
    • 전역에 설계된 정적 함수와 연결
    • 언리얼 오브젝트의 멤버 함수와 연결
      • 대부분의 경우 이 방식

매크로

  • DECLARE_{델리게이트유형}DELEGATE{함수정보}
  • 델리게이트 유형
    • DECLARE_DELEGATE
      • 일대일
      • C++만 지원
    • DECLARE_MULTICAST
      • 일대다
      • C++만 지원
    • DECLARE_DYNAMIC
      • 일대일
      • 블루프린트 지원
    • DECLARE_DYNAMIC_MULTICAST
      • 일대다
      • 블루프린트 지원
  • 함수 정보
    • 반환값이 있으면 _RetVal
      • MULTICAST는 반환값 지원 X
    • 인자 개수 따라 _OneParam, _TwoParams, ...
      • 인자가 없으면 공란
      • 최대 9개까지 지원
    예)
    DECLARE_DELEGATE
    DECLARE_DELEGATE_OneParam
    ECLARE_DELEGATE_RetVal_ThreeParams

  • 매크로 인자
    • DelegateName
      • F 접두사
      • class 이름
      • On (이벤트가 발생했다는 뜻)
      • Changed (정보가 변경됐다는 뜻)
      • Signature 접미사
      • 예) FDelegateClassOnChangedSignature
    • 인자 타입

실습

  • 델리게이트용 클래스 구현
  • 학생 클래스에서 알림 받는 함수 구현
  • 둘의 연결을 GameInstance에서 담당
  • GameInstance에서 델리게이트 클래스를 멤버 변수로
    • TObjectPtr를 이용한 전방선언
  • 델리게이트에 학생 정보를 추가
    • AddUObject를 이용
    • 객체와 함수를 넘겨줌

추가

  • AddUObject는 콜백으로 등록할 함수가 c++ 클래스 멤버 함수일 때
  • AddDynamic은 콜백으로 등록할 함수가 네트웍 RPC 및 블루프린트와 호환되는 UFUNCTION으로 지정된 C++ 클래스 멤버 함수일 때

0개의 댓글