DELEGATE 매크로, UCLASS, UPROPERTY
UE5.0 기반으로 공부를 진행하면서 1인칭 슈팅 샘플 게임을 통해 공부
- 책으로 처음 언리얼 엔진을 다루고 있긴 한데 기존에 학부에서 배웠던 C++만으로는 헷갈리는 부분들이 꽤 있어서 언리얼 C++관련 으로 정리 중
- 기본적으로 언리얼 클래스인 것을 표시하기 위해 클래스명 이름 앞에 U를 붙이는 것을 기조로 하는 것으로 보임
캐릭터 헤더 코드를 일단 분석
- #include와는 별개로 class UInputComponent;와 같이 사용되는 언리얼 클래스를 선언 (외부의 클래스) (책에 따르면 어딘가 다른 곳에서 구현될 가능성이 있다는 것을 의미라고 함)
- DECLARE_DYNAMIC_MULTICAST_DELEGATE 매크로
언리얼이 제공하는 C++ 매크로로 인자로 준 델리게이트 함수 유형을 선언하는데 사용한다고 한다. C#에서 델리게이트를 본 것과는 특이하게 매크로 함수로 언리얼에서는 사용 중으로 보인다. 사용 방법 등에 대해서는 공식 문서가 자세히 잘 작성되어 있어서 해당 링크를 통해서 이해가 가능하다.
- ACharacter를 상속하고 있고, APawn <- AActor로 부모 클래스를 상속하고 있음
1. UCLASS
- 매크로로 C++ 클래스가 언리얼의 리플렉션 시스템의 일부가 된다는 것을 보여준다고 한다. 위 스크린샷에서 config=Game이라고 되어 있는데 이건 DefaultGame.ini 설정 파일에 데이터를 저장할 수 있다는 것을 의미한다고 한다.
-> 사실 위 부분이 무슨 의미인지 잘 이해가 안되어서 시간을 들여서 좀 분석하고 있는 중
F10으로 해당 매크로의 정의 부분을 찾아보면 ObjectMacros.h가 열리는데 아래의 스크린샷처럼 되어있다. 그리고 그 하단에 nam espace UC에 enum에 주석이 된 부분을 확인해보면 해당 매크로에 사용가능한 키워드들이 나와 있음을 확인 가능하다. 찾아보면 config란 것이 보인다. 주석이 길게 되어있는데 사용을 보면 config=ConfigName 과 같이 쓰거나 config=inherit으로 사용한다고 함. 그래서 해당 클래스의 부모 클래스를 보니 ACharacter와 APawn도 마찬가지로 config=Game으로 된 것을 확인 (그 위의 AActor의 경우 Engine인 점 확인).
/// Load object configuration at construction time. These flags are inherited by subclasses.
/// Class containing config properties. Usage config=ConfigName or config=inherit (inherits config name from base class).
config,
-> 일단 그냥 코드를 깊게 판다고 바로 알 수 잇는 부분은 아닌 것으로 보여서 ChatGPT에게 해당 코드가 어떻게 동작하는지 확인한 결과. 코드로 config = Game과 같이 입력시 프로젝트 폴더 하위의 Config 폴더 안의 Default{입력한 스트링}.ini 파일을 읽어와서 초기화시에 설정한다는 것으로 보인다. 실제로 Config 관련 코드들은 아래의 코드를 참고 해보면 되고, LoadConfig의 경우 Obj.cpp에서 확인 가능하였다 (실제로 동작하는 분들은 엔진 코드라 너무 복잡한 관계로 이정도만 이해를 하기로 ...) 함
- Engine/Source/Runtime/CoreUObject/Public/UObject/Class.h
- Engine/Source/Runtime/CoreUObject/Private/UObject/Class.cpp
- Engine/Source/Runtime/CoreUObject/Private/UObject/Obj.cpp (버젼에 따라 이름이 다른 건지 gpt는 Object.cpp라고 알려줌)
2. UPROPERTY
- UCLASS와 마찬가지로 매크로 기능으로, 그 다음 줄에서 정의된 변수를 언리얼 에디터에서 보여주고 엔진의 메모리 관리 시스템에 속성을 포함신킨다. 라는 설명이 적혀 있다. 추가로 아래 스크린샷처럼 VisibleAnywhere, BlueprintAssignable 등의 인자로 지정자를 선택해서 세팅할 수 있다. 결론적으로 보면 에디터 툴에서 볼 수 있고 세팅가능한 지 설정 등을 하는 역할을 하는 것으로 보인다.
지정자들의 목록은 namespace UP 안에 enum으로 목록이 있는 것을 확인할 수 있다.
해당 지정자들 중 몇가지를 간략히 설명한 글
- VisibleDefaultsOnly : archetype 프로퍼티 창에서만 볼 수 있고 편집은 할 수 없음
- VisiableAnywhere : 모든 프로퍼티 창에서 볼 수 있으며 편집은 할 수 없음
- BlueprintReadonly : 블루프린트에서 읽기는 가능하지만 편집은 할 수 없음
- BlueprintAssignable : 블루프린트가 이 프로퍼티에 값을 할당할 수 있음
- Category = : 블루프린트 편집 툴에서 프로퍼티의 카테고리 지정 가능