Reflection
클래스, 구조체, 멤버 변수 멤버 함수, 열거형의 관련 정보(메타 데이터)를 수집 관리하는 별도의 시스템
Property System이라 부른다.
결국, 리플렉션 시스템은 메타 데이터를 수집 관리하는 시스템이다.
UPROPERTY()쓰는 이유는 리플렉션에 등록하기 위해서이다.메타 데이터란
"데이터를 위한 데이터"
'속성정보'라고도 불리는 메타데이터는 '데이터에 관한 구조화된 데이터', '다른 데이터를 설명해 주는 데이터'이다.
UObject
언리얼 엔진의 관리를 받는 특수한 객체이다
언리얼 엔진의 모든 클래스가 언리얼 오브젝트는 아니며, 클래스 접두어를 통해 언리얼 오브젝트를 구분할 수 있다.
언리얼 오브젝트의 클래스 접두어는 U, 일반 C++클래스의 접두어는 F를 사용하도록 권장하고 있다.언리얼 오브젝트가 제공하는 기능(함수성)
▪ 가비지 컬렉션
▪ 레퍼런스 업데이트
▪ 리플렉션
▪ 시리얼라이제이션
▪ 디폴트 프로퍼티 변경사항 자동 업데이트
▪ 자동 프로퍼티 초기화
▪ 자동 에디터 통합
▪ 실행시간에 유형 정보 사용가능
▪ 네트워크 리플리케이션
게임 객체의 기본 형식을 정의하는데 사용한다.
UClass 클래스는 매크로로 정의되며, UObject 클래스의 파생클래스를 선언한다. 이 클래스는 런타임 중에 객체를 생성하고 관리하는데 사용된다.
위와 같이 UCLASS(), GENERATED_BODY()매크로를 이용해서 클래스를 선언하면 언리얼 소스코드가 컴파일될때 언리얼 헤더 툴이 매크로를 분석하여 언리얼 클래스에 메타 데이터를 생성한다.
Unreal Build Tool (UBT)
언리얼 프로젝트 C++소스들의 빌드 과정을 총괄하는 프로그램이다.
동작방식
언리얼 기본 C++프로젝트를 생성하면 다음 3개의 C#파일이 프로젝트에 같이 생성된다.
(프로젝트명).build.cs
빌드 옵션을 관리
(프로젝트명).target.cs
빌드 타입을 정의
(프로젝트명Editor).target.cs존재 이유
언리얼은 멀티 플랫폼에서 개발를 목표로 하는 게임 엔진이다. 이 목적을 달성하기 위해서 빌드과정을 유연하게 프로그래밍 할 수 있는 툴이 필요해졌을 것이고 자연스럽게 UBT의 형태로 구현되었다고 할 수 있다.
C++가 아닌 C#으로 실행하는 이유
UBT같이 런타임에 실행되는 프로그램이 아니라 컴파일 타임에 실행되는 프로그램인 경우 성능상 느린게 크게 문제가 되지 않기 때문에, 복잡한 C++보다는 개발 편의성이 보장된 C# .NET프레임워크로 개발한다.
실행되는 시기
.uproject 실행할때, VS의 .sln파일에서 솔루션 빌드할 때
Unreal Header Tool (UHT)
언리얼 오브젝트 시스템을 지원하는 별도의 프로그램이다.
언리얼 오브젝트는 C++ 표준이 아닌 언리얼 엔진이 지원하는 자체적인 프레임워크이다. 따라서 언리얼 오브젝트에 제공되는 기능을 활용하기 위해서는, 해당 유형에 대해 헤더 파일에서 전처리 단계를 거쳐줘야 필요한 정보를 수집할 수 있다.
이러한 전처리 단계는 Unreal Header Tool에서 이루어 집니다.UHT가 컴파일 이전에 실행되어야 하는 이유
UObject는 아래 3단계를 거쳐 우리가 사용할 수 있는 형태로 생성된다.
1. 컴파일 이전 단계
1) 언리얼 오브젝트의 선언 규칙에 맞추어 클래스를 작성한다.
2) 선언된 언리얼 오브젝트를 UHT가 파싱하고 분석한다.
3) 올바르게 선언된 언리얼 오브젝트라면 메타데이터를 생성한다.2. 컴파일 단계
컴파일 단계에서는 각각의 언리얼 오브젝트마다 UClass를 생성합니다. UClass의 인스턴스를 생성하는 것은 아니다. UClass와 UClass 매크로는 다른 개념이다. UClass는 UHT에 의해 생성된 메타데이터를 수집하고 저장하는 클래스이다. 위와 같이 UClass에 저장된 데이터 덕분에 Reflection이 가능해 진다.
3. 런타임 단계
런타임 단계에서는 UClass 인스턴스, CDO 인스턴스가 생성됩니다.
실행 시기
프로그래머 빌드 명령-UBT실행-.build.cs, .target.cs컴파일-UHT실행-C++컴파일러 실행