정체불명의 모모

언리얼_UCLASS , UPROPERTY 본문

프로그래밍(c++)/언리얼엔진

언리얼_UCLASS , UPROPERTY

정체불명의 모모 2021. 6. 1. 01:07
이 글은 책 'C++를 사용한 언리얼 엔진 4개발'의 참고와 인터넷에서 서칭한 내용을 바탕으로 작성 했습니다.
  • UObject에서 파생된 UCLASS는 U로 시작하는 이름이어야 한다.
  • Actor에서 파생된 UCLASS는 A로 시작하는 이름이어야 한다.
  • 일반적인 C++클래스는 특별한 이름 규칙이 없지만, 원하는 경우 앞에 F를 붙여 이름을 정할 수 있다.

ㅁUCLASS - UObject에서 파생

:   UCLASS 매크로를 사용해 커스텀 C++ 오브젝트를 선언하면 UE4 클래스처럼 동작하는 커스텀 C++ 클래스를 선언 할 수도 있다. 

    UCLASS 매크로를 사용하면 할당과 해제를 할때 클래스가 UE4의 스마트 포인터와 메모리 관리 루틴을 사용하게 된다.


Tip1. UCLASS는 UE4 매크로를 다수 포함한 c++클래스 이다.
       이 매크로는 UE4 편집기와의 통합을 도와주는 추가 C++ 헤더 코드를 생성한다.

Tip2UCLASS 매크로를 사용할 때, UCLASS 오브젝트의 생성과 삭제는 UE4에 의해 처리돼야 한다.
       오브젝트의 인스턴스를 생성할 때는 ConstructObect함수를 사용해야 하며 오브젝트를 삭제 할때는
       UObject::ConditionalBeginDestroy() 함수를 사용해야 한다.
       C++ 네티브 키워드인 new 와 delete를 사용하면 안 된다.

ㅁ UPROPERTY 

:  UPROPERTY의 역할은 기본적으로 언리얼 리플렉션 시스템에 해당 프로퍼티가 있음을 알리는 것 입니다.

   빌드 시에 UHT(Unreal Header Tool)이 이 매크로를 감지하고 리플렉션 유형에 추가하게 됩니다.

   이렇게 언리얼 리플렉션 시스템에 추가된 UPROPERTY는 가비지 콜렉션에 의해 생명 주기가 관리되며,

    리플렉션을 통해 이 멤버 변수의 이름, 유형 등을 런타임 중에 확인할 수 있게 됩니다.

 

    반대로 말하자면, UPROPERTY()매크로가 기술되지 않은 멤버 변수(프로퍼티)는 언리얼 리플렉션에 노출되지

    않으며, 리플레션 시스템이 제공하는 GC , 런타임 정보 확인 등을 사용할 수 없다는 이야기가 되는 셈입니다.

   ※ 리플렉션[Reflection] : 프로그램이 실행시간에 자기 자신을 조사하는 기능입니다.
        이는 엄청나게 유용한  데다 언리얼 엔진 테크놀로지의 근간을 이루는 것으로, 에디터의 디테일 패널, 시리얼라이제이션 , 
     가비지 콜렉션, 네트워크 리플리케이션, 블루프린트/C++ 커뮤니케이션 등 다수의 시스템에 탑재된 것입니다.
        언리얼에는 자체적으로 C++ 클래스, 구조체 , 함수, 멤버 변수 , 열거형 관련 정보를 수집, 질의 ,조작하는 별도의 시스템이 구축되어
        있습니다.
        전형적으로 이러한 리플렉션은 '프로퍼티 시스템'이라고 부르는데, '리플렉션'은 그래픽 용어이기도 하기 때문입니다.
        
       리플리케이션 시스템은 옵션입니다. 리플렉션 시스템에 보이돋록 했으면 하는 유형이나 프로퍼티에 주석을 달아주면, 
       Unreal Head Tool [UHT]가 그 프로젝트를 컴파일 할 때 해당 정보를 수집합니다.

 


지정자 DefaultsOnly InstanceOnly Anywhere
Edit 아키타입상에서만 값을 편집
할 경우 사용
인스턴스상에서만
값을 편집해야 할 경우 사용
아키타입 또는 인스턴스 모두에서 범용적으로 값을 편집해야 할 경우 사용
Visible 아키타입에서만 보여야 할 경우 사용 인스턴스에서만
보여야 할 경우 사용
아키타입 또는 인스턴스 모두에서 보일 값이여야할 경우 사용

▶ 아키타입 : 컨텐츠 브라우저 상에 표시되는 C++ 또는 블루프린트 클래스

▶ 인스턴스 : 아키타입을 통해 생성된 객체

▶  Visible : 보여주기만 할 경우 (객체에 사용할 경우 오브젝트 레퍼런스는 변경되지 않지만, 오브젝트 내의 속성들은 블루프린트에서 

    편집이 가능하다.)

▶  Edit : 편집이 가능하게 할 경우

지정자 ReadWrite ReadOnly Setter Getter
Blueprint 블루프린트에서 읽거나 쓸 수 있습니다. 블루프린트에서 읽을 수 있지만 변경은 안됩니다. BlueprintReadWrite를 바탕으로 블루프린트에서 변수를 Set할 때 SetterFunctionName 함수를 Setter 함수로 실행시킨다는 말 입니다. 커스텀 엑세서(Accessor, Getter의 다른말)함수를 지정합니다.
또한, BlueprintSetter또는 BluePrintReadWirte 지정자가 지정되지 않으면, BlueprintReadOnly로 간주 합니다.

 

델리게이트

지정자 설명
BlueprintAssignable 멀티 캐스트 델리게이트하고만 사용할 수 있습니다. 프로퍼티를 블루프린트에서 할당할 수 있도록 노출시킵니다.
델리게이트 변수가 블루프린트 내 블루프린트 및 우클릭 액션 목록 등에서 노출 되며, 사용할 수 있습니다.
BlueprintCallable 멀티캐스트 데리게이트 전용입니다. 프로퍼티를 노출시켜야 블루프린트 코드에서 호출할 수 있습니다.
Broadcast() 등의 함수를 블루프린트에서 호출할 수 있음을 의미합니다.

 

Transient 키워드

언리얼 오브젝트에는 직렬화 기능이 있어서 오브젝트의 UPROPERTY속성을 저장하고 로딩할 수 있다.

  컴포넌트의 스탯중 CurrentHP 값은 게임을 시작할 때마다 변경되므로 이 값을 보관하는 것은 의미가 없고 

  오히려 오브젝트를 저장할 때 필요없는 디스크 공간만 차지 한다.

  이러한 속성에는 Transient 키워드를 추가해 해당 속성을 직렬화에서 제외시키는 것이 좋다.

 

 

그 외 키워드

  • Category : "카테고리 명" / 속성을 관리할 수 있게 분류하는 기능 
  • meta = (AllowPrivateAccess = true) : 변수를 은닉(private)하면서, private변수를 블루프린트에 노출할 수 있으며       에디터에서 편집이 가능하게 설정할 수 있다.
  • meta = (AllowProtectedAccess = true) : AllowPrivateAccess와 동일한 이유이다.

 

참고 사이트(감사합니다.)

[Unreal C++] - UPROPERTY 매크로 (tistory.com)

 

[Unreal C++] - UPROPERTY 매크로

UPROPERTY(키워드) C++ 프로그래밍에서 포인터를 선언하면 명시적으로 객체를 소멸시켜야 차후 메모리 관리에 문제가 발생하지 않는다. 하지만 언리얼 엔진은 런타임 동안 객체가 더 이상 사용되지

hombody.tistory.com

언리얼 UPROPERTY( Unreal UPROPERTY ) (tistory.com)

 

언리얼 UPROPERTY( Unreal UPROPERTY )

언리얼 엔진 위에서 언리얼 엔진과 상호작용하려는 코드를 작성하기 위해서는 언리얼에서 제공하는 각종 매크로의 도움을 받을 수 밖에 없습니다. 그 중, UPROPERTY는 멤버 변수( 또는 프로퍼티 )

minusi.tistory.com

 

Comments