언리얼 엔진은 성능과 안정성을 모두 얻기 위해 자체적인 시스템을 구축하여 이루어졌습니다.
그중에서도 리플렉션 시스템은 언리얼 엔진의 근간을 이루는 아주 중요한 부분입니다.
1) 언리얼 오브젝트 리플렉션 시스템이란?
리플렉션 시스템은 프로그램이 실행시간에 자기자신을 조사하는 기능을 말합니다.
이 기능을 사용하기 위해서는 언리얼 엔진에서 지정한 UENUM(), UCLASS()과 같은 매크로를 수식해줘야 합니다.
매크로가 수식되면 UHT(언리얼 헤더 툴)에 의해 이 매크로들이 분석되고 자동적으로
리플렉션 시스템에 필요한 소스코드들을 생성해줍니다.
이렇게 생성된 소스코드들로 구성된 요소는 언리얼 엔진의 관리 대상이 되는 언리얼 오브젝트로서 작동하게 됩니다.
2) 언리얼 오브젝트의 구성
언리얼 오브젝트에서는 특별한 매크로를 사용하는 프로퍼티와 함수를 지정할 수 있습니다.
- 언리얼 엔진에 의해 관리되는 멤버 프로퍼티 : UPROPERTY() 매크로
- 언리얼 엔진에 의해 관리되는 멤버 함수 : UFUNCTION() 매크로
- 매크로 안에서 사용할 수 있는 여러 지시자들
위와 같은 매크로들을 통해 설계자의 부담을 덜고 훨씬 더 효율적이고 안정적인 설계가 가능합니다.
언리얼 오브젝트 내에서 리플렉션되지 않는 요소를 사용할 수 있지만,
이 경우 언리얼 엔진의 관리 대상이 되지 않아 설계자가 직접 관리해줘야 합니다.
예시) 동적할당된 포인터의 해제와 소멸을 설계자가 일일이 신경써줘야 함
모든 언리얼 오브젝트는 클래스 정보와 함께 합니다.
따라서 클래스를 통해 자신이 가진 멤버의 정보를 컴파일 타임과 런타임에서 조회가 가능합니다.
다양한 기능을 제공하는 언리얼 오브젝트는 NewObject() API를 통해 생성할 수 있습니다.
3) 언리얼 오브젝트의 기능
(1) 자동 프로퍼티 초기화 : UPROPERTY() 매크로가 수식되면 언리얼 엔진이 자동으로 값을 초기화해줍니다.
(2) 레퍼런스 자동 업데이트 : 가비지 컬렉터의 관리 대상으로 만들어줍니다.
(3) 직렬화 : 언리얼 오브젝트의 객체를 설계자가 지정한 포맷에 밎춰 저장하거나 불러들일 수 있습니다.
(4) 프로퍼티 값 업데이트 : CDO(Class Default Object)를 사용해 클래스 오브젝트의 기본값을 효과적으로 관리합니다.
(5) 에디터 통합 : 매크로 안에 지시자를 넣어주면 에디터와 통합되어 설계자가 유용한 기능을 사용할 수 있습니다.
(6) 런타임 유형정보 및 형변환 : 런타임에서 오브젝트 정보를 얻을 수 있고, 안전한 캐스팅이 가능합니다.
(7) 가비지 컬렉션 : 더 이상 사용하지 않는 언리얼 오브젝트는 언리얼 시스템이 자동회수하여 메모리에서 소멸시킵니다.
(8) 네트워크 리플리케이션 : 네트워크 통신을 통해 언리얼 오브젝트를 자동으로 주고 받을 수 있는 시스템을 구축합니다.
4) CDO(Class Default Object)란?
이 포스팅에서는 언리얼 오브젝트에서 제공하는 여러 유용한 기능, 그 중에서도 CDO에 대해 알아볼 것입니다.
기본적으로 언리얼 클래스의 정보에는 CDO가 함계 포함됩니다.
그리고 CDO는 언리얼 인스턴스가 갖는 기본 값을 보관하는 템플릿 인스턴스입니다.
그러므로 하나의 클래스에서 다수의 인스턴스를 생성해 게임 내에 배치하는 경우에
일관성있게 기본값을 조정하는데 아주 유용하게 사용할 수 있습니다.
거기다 CDO는 엔진의 초기화 과정에서 생성되기에 콘텐츠 제작에서 안심하고 사용이 가능합니다.
생성자에서 생성하는 CDO는 런타임에서 GetDefaultObject()를 통해 가져올 수 있습니다.
5) CDO의 사용
간단한 코드 예제를 통해 CDO를 사용해 보도록 하겠습니다.
실행결과는 다음과 같습니다.
예제를 통해
CDO를 생성하는 방법, 언리얼 클래스를 가져오는 방법 그리고 CDO를 실제 런타임에서 사용하는 방법을 알아보았습니다.
언리얼 엔진은 리플렉션 시스템이라는 기반 위에서 막강한 기능을 사용자에게 제공합니다.
그 기능의 이점을 잘 이해하고 사용한다면 언리얼 엔진을 사용하는 데 있어서 큰 도움이 될 것입니다.
'언리얼 > 언리얼 C++' 카테고리의 다른 글
언리얼 C++ - 인터페이스 (0) | 2024.06.30 |
---|---|
언리얼 C++ - 언리얼 리플렉션 시스템의 활용 (0) | 2024.06.30 |
언리얼 C++ - 언리얼의 문자열 (0) | 2024.06.24 |
언리얼 C++ - 간단한 언리얼 오브젝트 클래스 생성 (0) | 2024.06.17 |
언리얼 C++에 대해 배워보자! - 언리얼 오브젝트 (0) | 2024.06.17 |