Skip to main content

[Unreal] 언리얼 구조체




언리얼 구조체의 특징 #


  • 언리얼 구조체는 언리얼 오브젝트와 다르다!!
  • 언리얼 구조체는 데이터 저장과 전송에 특화된 가벼운 객체이다.
    • 언리얼 구조체는 단순한 데이터 타입에 적합하다.
    • 보다 더 복잡한 인터렉션을 위해서는 UObject 또는 AActor 서브클래스를 만드는 것이 좋다.

  • 언리얼 구조체는 C++ 오브젝트이다.
    • 언리얼 오브젝트가 아니므로 이름은 F로 시작한다.
    • 따라서 언리얼 엔진이 메모리 관리를 해주지 않는다.
    • 대부분 힙에 메모리 할당(포인터로 관리되지 않는다)을 할 필요 없이, 스택 내 데이터로 사용된다.
    • 당연하지만 NewObject() 도 사용할 수 없다.
    • 리플리케이션(Replication) 기능도 사용할 수 없다.

  • 대부분 GENERATED_BODY() 매크로를 붙인다.
    • 이걸 붙이면 언리얼 구조체는 내부적으로 UScriptStruct 라는 클래스로 구현된다.
    • 이걸 붙이면 제한적으로 리플렉션(Reflection)을 지원한다.
      • 내부에 UPROPERTY() 변수만 선언할 수 있고, UFUNCTION()은 선언할 수 없다.
      • UPROPERTY() 를 붙인 멤버 변수는 언리얼 엔진이 메모리 관리를 해준다.

  • 언리얼 구조체를 위한 Make 및 Break 함수 자동 생성 기능이 있다.
    • 먼저, USTRUCT(BlueprintType) 로 설정해야한다.
    • 언리얼 구조체 안에 하나 이상의 BlueprintReadOnly 또는 BlueprintReadWrite 프로퍼티가 있다면 Break가 표시된다.
    • Break가 생성한 순수 노드는 BlueprintReadOnly 또는 BlueprintReadWrite 로 태그된 각 프로퍼티에 출력 핀을 하나씩 제공한다.



언리얼 구조체 구현 방법 #

// (1) 구조체를 구현하려는 헤더파일을 연다. 

USTRUCT(BlueprintType) // (2) USTRUCT() 매크로를 추가한다. 
struct FMyStruct
{
    GENERATED_BODY() // (3) GENERATED_BODY() 매크로를 추가한다. 

    // (4) 구조체의 멤버 변수를 UPROPERTY() 로 태그하여 
    // 언리얼 엔진의 리플렉션 시스템과 블루프린트 스크립팅에 표시할 수 있다. 

    //~ 다음 멤버 변수는 블루프린트 그래프를 통해 액세스할 수 있습니다.
    // 테스트 변수에 대한 툴팁입니다.
    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Test Variables")
    int32 MyIntegerMemberVariable;

    //~ 다음 멤버 변수는 블루프린트 그래프를 통해 액세스할 수 없습니다.
    int32 NativeOnlyMemberVariable;

    /**~
    * 이 UObject 포인터는 블루프린트 그래프에 액세스할 수 없으나
    * UE4의 리플렉션, 스마트 포인터, 가비지 컬렉션 시스템에
    * 표시됩니다.
    */
    UPROPERTY()
    UObject* SafeObjectPointer;
};