C++ 헤더 프리뷰
블루프린트 클래스가 마치 C++로 작성된 것처럼 검사 결과를 볼 수 있다.
C++ 헤더 프리뷰 사용법 : 메인 메뉴에서 Tools → C++ 헤더 프리뷰 클릭 → 원하는 클래스 선택
언리얼에서의 세 가지 주요 클래스
UObject : 언리얼 엔진의 기본 클래스
- 주요 기능
- 가비지 컬렉션(GC, Garbage Collection)
- 네트워킹 지원
- 프로퍼티 및 멤버 함수의 리플렉션
AActor : 에디터 또는 런타임 중에 게임 레벨에 추가할 수 있는 UObject
- 런타임 중에 추가될 때는 액터가 스폰됐다고 표현한다.
- AActor는 멀티플레이어 환경에서 네트워킹 중에 복제될 수 있는 기본 타입
- 동기화가 필요한 모든 컴포넌트의 정보를 제공한다.
UActorComponent : 액터 또는 액터 자체에 속하는 다른 컴포넌트에 연결할 컴포넌트를 정의하는 기본 클래스
언리얼에서의 엔티티
UStruct : 일반적인 데이터 구조를 생성하는 데 사용된다.
- 특정 클래스에서 확장되지 않는다.
UEnum : 요소의 열거형을 나타내는 데 사용된다.
언리얼에서의 클래스 이름 접두사
U : UObject에서 파생된 일반적인 객체(ex. Component)에 사용된다.
A : AActor에서 파생된 객체에 사용되며 레벨에 추가될 수 있다.
F : FColor 구조체와 같은 일반적인 클래스 및 구조체에 사용된다.
T : TArray 또는 TMap과 같은 템플릿에 사용된다.
I : 인터페이스에 사용된다.
E : 열거형에 사용된다.
B : bool 또는 uint8(bool 대신 사용 가능)에 사용된다.
이러한 대부분의 접두사는 필수다. 액터에서 파생된 클래스의 이름을 A접두사 없이 지정할 시 오류가 발생한다. 따라서 언리얼 엔진은 에디터에서 한 번 접두사를 숨긴다. 이 규칙은 C++ 클래스에만 적용되며, 블루프린트는 이러한 접두사 없이 이름을 지정할 수 있다.
UHT : 언리얼에서 UObject 시스템을 지원하는 사용자 정의 파싱 및 코드 생성 도구.
- 언리얼용 C++ 헤더를 파싱하고, 사용자가 만든 클래스가 엔진에서 작동하는 데 필요한 상용구 코드를 생성한다.
- 언리얼 헤더 툴이 자동 생성하는 [클래스 이름].generated.h 파일은 엔진에서 코드가 정상 작동하는 데 필요한 매크로를 모두 포함한다.
- 이 파일은 헤더에서 선언된 마지막 include 파일이어야 한다. 그렇지 않으면 컴파일러가 오류를 발생시킨다.
언리얼에서의 클래스 생성자
/// ...
UCLASS(Blueprintable, BlueprintType)
class APickup : public AStaticMeshActor
{
GENERATED_BODY()
public:
APickup();
//...
};
- 클래스 생성자는 일반적인 C++ 클래스와 마찬가지로 프로퍼티의 기본값을 설정하는 데 사용되며, 액터 자체에 컴포넌트를 생성하고 추가하는 데도 사용된다.
언리얼 엔진 리플렉션 시스템
리플렉션 : 프로그램이 런타임에 자신의 구조를 검사할 수 있는 기능
- 에디터의 디테일 패널, 직렬화, 가비지 컬렉션, 네트워크 복제, 블루프린트와 C++ 간의 통신 같은 다양한 시스템을 지원한다.
- C++에서는 기본 지원이 아니므로 에픽게임즈가 UE에서 사용할 수 있도록 자체 시스템을 개발했다.
- 리플렉션을 사용하려면 시스템에 표시하려는 타입이나 프로퍼티에 UCLASS(), UFUNCTION(), UPROPERTY()와 같은 매크로를 표기해야 한다.
- 이러한 매크로를 활성화하려면, #include “Pickup.generated.h” 선언을 사용해야 한다.
매크로 설명
- UCLASS() : UObject에서 파생되는 클래스의 리플렉션 데이터를 생성하는 데 사용
- USTRUCT() : 구조체의 리플렉션 데이터를 생성하는 데 사용
- GENERATED_BODY() : 이 마크업은 해당 타입에 필요한 상용구 코드로 모두 대체된다.
- UPROPERTY() : 관련된 멤버 변수가 블루프린트 접근성이나 네트워크 복제와 같은 추가 기능이 있음을 엔진에 알리는데 사용된다.
- UFUNCTION() : 확장된 블루프린트 클래스에서 이 함수를 호출하거나 블루프린트 자체에서 함수를 재정의할 수 있다.
- 리플렉션 시스템은 가비지 컬렉터에서도 사용되므로 메모리 관리를 걱정할 필요가 없다.
메모리 관리와 가비지 컬렉션
- 게임 레벨에서 수천 개(혹은 수만 개)의 활성화된 오브젝트가 있을 때, 가비지 컬렉션은 프로그래밍에 반드시 필요하다.
- 더 이상 필요하지 않은 객체를 자동으로 수집하고 처리해 모든 것을 깔끔하고 정리된 상태로 유지하는데 도움이 된다.
- 가비지 컬렉션은 프로그램이 원활히 실행될 수 있도록 메모리 누수나 성능 문제를 해결하기 때문에 멋진 기능을 만드는데 더 집중할 수 있다.
- C++에서는 가비지 컬렉션을 기본적으로 구현하지 않는다. 따라서, 언리얼 엔진이 자체 시스템을 구현한다.
- 프로그래머는 객체의 참조가 유효한지만 확인하면 된다.
- 클래스에 가비지 컬렉션을 활성화하려면 UObject에서 상속돼야 한다.
- 그렇게 되면 시스템은 가비지 컬렉션되지 않아야 할 객체 리스트(root라고도 한다)를 유지한다.
- 객체가 루트에 리스트 돼 있는 한 객체는 삭제되지 않고 보존된다.
- 하지만 이 리스트에서 제거되면, 다음에 가비지 컬렉터가 호출될 때(일정 간격)메모리에서 삭제된다.
액터들은 레벨이 종료될 때만 파괴된다. 그러나 Destroy() 멤버 함수를 호출하면 즉시 게임에서 제거되고 가비지 컬렉터가 활성화될 때 삭제된다.
'책 정리' 카테고리의 다른 글
| [3장] 소용돌이탄 베리에이션 (0) | 2025.05.23 |
|---|---|
| [1장] 슈팅 게임의 구조 (0) | 2025.05.16 |