-
언리얼 C++ 설계 III - 델리게이트게임 개발/Unreal 2024. 1. 30. 23:50
강한 결합과 느슨한 결합
강한 결합(Tight Coupling)
클래스들이 서로 의존성을 가지는 경우를 의미한다.
class Staff { public : Staff(int InPower ) : Power(InPower){} int Power = 0; }; class Magician { public: Magician(Staff InStaff) : MyStaff(InStaff) {} protected: Staff MyStaff; };
예시에서 Staff가 없는 경우 Magician이 만들어 질 수 없다.
이 때 Magician은 Staff에 대한 의존성을 가진다고 한다.
Staff말고 다른 무기를 가진다면?
class ICheck { public: virtual bool check() = 0; }; class Staff : public ICheck { public: Staff(int InPower) : Power(InPower) {} virtual bool check() { return true; } private: int Power = 0; }; class Magician { public: Magician(ICheck* InCheck) : Check(InCheck) {} protected: ICheck* Check; };
느슨한 결합
실물에 의존하지 말고 추상적 설계에 의존하라(DIP 원칙)
왜 Magician은 Staff가 필요한가? 마법학교에 입장하여야 하기 때문
ICheck를 상속받은 새로운 무기 인터페이스를 선언해 해결
이러한 느슨한 결합 구조는 유지 보수를 손쉽게 만들어준다.
발행 구독 디자인 패턴
푸시 형태의 알림을 구현하는데 적합한 디자인 패턴
발행자(Publisher)와 구독자(Subscriber)로 구분된다.
콘텐츠 제작자는 콘텐츠를 생산한다.
발행자는 콘텐츠를 배포한다.
구독자는 배포된 콘텐츠를 받아 소비한다.
제작자와 구독자가 서로를 몰라도, 발행자를 통해 콘텐츠를 생산하고 전달할 수 있다.(느슨한 결합)
발행 구독 디자인 패턴의 장점
제작자와 구독자는 서로를 모르기 때문에 느슨한 결합으로 구성된다.
유지 보수(Maintenance)가 쉽고, 유연하게 활용될 수 있으며(Flexibility), 테스트가 쉬워진다.
시스템 스케일을 유연하게 조절할 수 있으며(Scalability), 기능 확장(Extensibility)이 용이하다
언리얼 델리게이트 선언시 고려사항
델리게이트를 설계하기 위한 고려 사항
어떤 데이터를 전달하고 받을 것인가? 인자의 수와 각각의 타입을 설계
몇개의 인자를 전달할 것인가?
어떤 방식으로 전달할 것인가?
일대일로 전달
일대다로 전달
프로그래밍 환경 설정
C++ 프로그래밍에서만 사용할 것인가
UFUNCTION으로 지정된 블루프린트 함수와 사용할 것인가?
어떤 함수와 연결할 것인가?
클래스 외부에 설계된 C++ 함수와 연결
전역에 설계된 정적 함수와 연결
언리얼 오브젝트의 멤버 함수와 연결 (대부분의 경우에 이 방식을 사용)
언리얼 델리게이트 선언 매크로
DECLARE_{델리게이트유형}DELEGATE{함수정보}
델리게이트 유형 : 어떤 유형의 델리게이트인지 구상한다
일대일 형태로 C++만 지원한다면 유형은 공란으로 둔다.
DECLARE_DELEGATE
일대다 형대로 C++만 지원한다면 MULTICAST를 선언한다.
DECLARE_MULTICAST
일대일 형태로 블루프린트를 지원한다면 DYNAMIC을 선언한다.
DECLARE_DYNAMIC
일대일 형태로 블루프린트를 지원한다면 DYNAMIC과 MULTICAST를 조합한다.
DECLARE_DYNAMIC_MULTICAST
함수 정보 : 연동 될 함수 형태를 지정한다
인자가 없고 반환값도 없으면 공한으로 둔다. 예) DECLARE_DELEGATE
인자가 하나고 반환값이 없으면 OneParam으로 지정한다. 예) DECLARE_DELEGATE_OneParam
인자가 세 개고 반환값이 있으면 RetVal_ThreeParams로 지정한다.
예) DECLARE_DELEGATE_RetVal_ThreeParams (MULTICAST는 반환값을 지원하지 않음)
최대 9개까지 지원
언리얼 델리게이트 매크로 선정 예시
학사 정보가 변경되면 알림 주체와 내용을 학생에게 전달한다.
두 개의 인자를 가짐
변경된 학사 정보는 다수 인원을 대상으로 발송한다.
MULTICAST를 사용
오직 C++ 프로그래밍에서만 사용한다.
DYNAMIC은 사용하지 않음
DECLARE_MULTICAST_DELEGATE_TwoParams 매크로 사용
정리
느슨한 결합이 가지는 장점
- 향후 시스템 변경 사항에 대해 손쉽게 대처할 수 있음
느슨한 결합으로 구현된 발행 구독 모델의 장점
- 클래스는 자신이 해야 할 작업에만 집중할 수 있음.
- 외부에서 발행한 변경 사항에 대해 영향받지 않음
- 자신의 기능을 확장하더라도 다른 모듈에 영향을 주지 않음
언리얼 C++의 델리게이트의 선언 방법과 활용
- 몇 개의 인자를 가지는가?
- 어떤 방식으로 동작하는가? (MULTICAST 사용 유무 결정)
- 언리얼 에디터와 함께 연동할 것인가? (DYNAMIC 사용 유무 결정)
- 이를 조합해 적합한 매크로 선택
#이득우의 언리얼 프로그래밍 Part1
'게임 개발 > Unreal' 카테고리의 다른 글
언리얼 컨테이너 라이브러리 I - Set (0) 2024.02.01 언리얼 컨테이너 라이브러리 I - Array (0) 2024.01.31 컴포지션(Composition) (0) 2024.01.30 언리얼 C++ 설계 I - 인터페이스 (0) 2024.01.29 언리얼 오브젝트 리플렉션 시스템 I (1) 2024.01.27