📗 직렬화 사용
A ob; 라는 변수를 선언했을 때 A 객체 자체의 주소에 접근할 수 없다보니 바이트스트림 형태로 바꾸어 접근할 수있다. 따라서 어느 CPU나 어느 RAM이든 문제없이 I/O를 통해 접근할 수 있게 하는 기능이 직렬화 혹은 역직렬화이다.
프로그램을 내부적으로 사용할 때는 에디터에 공개할 필요가 없기 때문에 직렬화를 사용하지 않는다. 그러나 언리얼 엔진에서 게임을 개발할 때 사용하는 블루프린트도 에디터 소속이기 때문에 직렬화를 해줘야 블루프린트에 접근하여 게임을 개발할 수 있다. 즉, 에디터에서 직렬화하여 공개하고, 블루프린트에도 공개하라는 옵션을 설정하면 언리얼 엔진에서 C++을 통한 개발작업이 이뤄질 수 있다.
📙 클래스 선언
일반적으로 클래스를 선언할 때
class (프로젝트명 = 모듈명)_API (클래스명, 앞에 접두사 U/A 가 붙음)
와 같은 구조를 갖추어 선언한다.
예를 들면 "class UEProject_API AC01_Property" 와 같다.
프로그래머가 내부적으로 직접 사용할 클래스들은 UObject를 상속받지 않는다. UObject를 상속받은 클래스부터가 가비지 콜렉터에 의해 메모리가 자동관리 된다.
📘 직렬화 매크로
이후 직렬화 코드는 클래스의 선언 위에 UCLASS, UPROPERTY, UFUNCTION 선언을 붙인다.
클래스를 직렬화하면 직렬화 코드가 필요하므로, 직렬화 코드가 들어간 매크로인 GENERATED_BODY() 명령이 붙는다.
직렬화는 코드를 그대로 치환하기 때문에 UCLASS() - class선언 사이와, class선언 - GENERATED 사이에는 그 어떠한 코드도 들어가면 안된다.
또한 위 코드는 AActor를 상속받았기 때문에 이하 클래스는 모두 A 접두사가 붙게 된다. (UObject를 상속받으면 U가 붙음)
위 코드는 언리얼 컴파일러, 정확히 언리얼 헤더에 의해 자동으로 생성되는 부분들이다. 이때 사용되는 헤더가 바로
#include "클래스명.generated.h" 이다.
위 헤더 역시 클래스를 직렬화할 때 한 쌍으로 사용되기 때문에 절대 빠져서는 안된다.
또한 언리얼은 기본적으로 맨 위에 "CoreMinimal.h" 헤더를 넣는다. 이 헤더는 언리얼의 핵심 코드만을 넣어놓았다.
직렬화할 변수나 함수 위에는 반드시 매크로가 들어가야 한다.
- 멤버변수는 UPROPERTY()
- 함수는 UFUNCTION()
- 클래스는 UCLASS()
이때 매크로가 소속된 클래스나 함수가 직렬화되어있지 않고 안에있는 변수에만 직렬화가 되어있으면 소용이 없다.