언리얼 C++ 프로그래밍

[언리얼 C++] 구조체 선언 및 정의

언린이 2021. 7. 30. 10:07

1. 구조체 선언

USTRUCT([Specifier, Specifier, ...])
struct StructName
{
    GENERATED_BODY()
};

게임플레이 클래스의 구조체는 일반 C++ 구조체 선언 위에 USTRUCT 매크로를 사용하여 선언하며, USTRUCT 매크로에 구조체 지정자를 추가하여 엔진 및 에디터의 다양한 부분에서 어떤식으로 작동할지를 제어할 수 있습니다.

그리고 구조체 안에는 일반 변수, UProperty 변수, 함수, 연산자를 포함할 수 있습니다.

구조체 선언시 주의할 점은 구조체는 클래스 선언 이전에 선언되어야 한다는 것입니다.

 

 

2. 구조체 지정자

구조체 지정자 효과
Atomic 이 구조체는 항상 하나의 단위로 Serialize 됨을 나타냅니다.
BlueprintType 이 구조체를 블루프린트에서 변수로 사용할 수 있는 유형으로 노출시킵니다.
NoExport 이 클래스에 대해서는 자동생성 코드가 생성되지 않으며, 헤더는 메타데이터 분석을 위해서만 제공됩니다.

구조체 선언시, 위 표에 있는 구조체 지정자를 붙여 구조체가 엔진과 에디터의 다양한 부분에서 어떤식으로 작동할지를 제어할 수 있습니다.

 

 

3. 구조체 구현

USTRUCT(BlueprintType)
struct FMyStruct
{
    GENERATED_BODY()

    // 다음 멤버 변수는 블루프린트 그래프에서 접근할 수 있습니다:
    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Test Variables")
    int32 MyIntegerMemberVariable;

    // 다음 멤버 변수는 블루프린트 그래프에서 접근할 수 없습니다:
    int32 NativeOnlyMemberVariable;

    // 이 UObject 포인터는 블루프린트 그래프에서 접근할 수 없지만
    // UE4의 리플렉션, 스마트 포인터, 가비지 컬렉션 시스템에서는 볼 수 있습니다.
    UPROPERTY()
    UObject* SafeObjectPointer;
};

구조체의 구현은 다음과 같은 스텝으로 진행하면 됩니다.

  • 구조체를 정의할 헤더 파일에 일반 C++ 구조체를 정의합니다.
  • 요구사항에 알맞는 구조체 지정자를 포함한 USTRUCT 매크로를 구조체 상단에 추가합니다.
  • 구조체의 멤버 변수, 함수 및 연산자를 선언합니다. 여기서 태그를 사용하여 언리얼 엔진의 리플렉션 시스템 및 블루프린트 스크립팅에 노출시킬 수도 있습니다.

 

 

4. 구조체 사용시 유의사항

  • 구조체는 언리얼 엔진의 스마트 포인터 및 가비지 컬렉션 시스템을 사용하여 가비지 컬렉팅에 의해 제거되지 않도록 할 수 있습니다.
  • 구조체는 서로 다르며 간단한 데이터 유형에 가장 적합합니다.
    • 프로젝트 내에서 더 복잡한 상호 작용을 위해 구조체 대신 하위 클래스를 만들 수 있습니다.
  • 구조체는 복제에 고려되지 않습니다.
    • 구조체 안의 UProperty 변수는 복제에 고려됩니다.