일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- operator new
- virtual function
- resource management class
- Vector
- 메타테이블
- c++
- 영화
- UE4
- 반복자
- 암시적 변환
- 비교 함수 객체
- 오블완
- exception
- 영화 리뷰
- 루아
- implicit conversion
- more effective c++
- 예외
- 게임
- 티스토리챌린지
- 언리얼
- Effective c++
- 스마트 포인터
- 상속
- reference
- 참조자
- lua
- Smart Pointer
- effective stl
- 다형성
- Today
- Total
스토리텔링 개발자
[UE4] 프로퍼티(UPROPERTY) 본문
개요
언리얼에서 클래스 멤버 변수에 프로퍼티 매크로가 붙어있는 것은 일반적인 형태입니다.
예컨대 아래와 같은 용도들로 활용되기 위해서 사용합니다.
블루프린트에서 사용하기 위해서.
혹은 가비지 컬렉션에 수집당하지 않게 하려고.
기타등등.
이렇게 다양한 기능으로 확장해주는 프로퍼티에 대해 알아봅니다.
매크로 함수
이번에 다룰 프로퍼티(UPROEPRTY())는 매크로 함수 중 한 종류입니다.
그러므로 우선 매크로 함수에 대해 알아보겠습니다.
언리얼 엔진은 아래와 같은 매크로 함수들을 제공합니다.
UENUM()
- 마킹된 enum의 리플렉션 정보 수집
UCLASS()
- 마킹된 class의 리플렉션 정보 수집
USTURCT()
- 마킹된 struct의 리플렉션 정보 수집
UFUNCTION()
- 마킹된 함수의 리플렉션 정보 수집
- 함수 직렬화
- 블루프린트 노출
UPROPERTY()
- 마킹된 변수의 리플렉션 정보 수집
- 변수 직렬화
- gc의 레퍼런스 카운트 +1로 사용중임을 표시
즉 매크로를 붙인다는 것 = 리플렉션 정보를 수집하겠다는 의도로 정리가 가능합니다.
그렇다면 리플렉션이란 뭘까요?
리플렉션 시스템
리플렉션이란 런타임에 자신의 정보를 가져올 수 있는 기능입니다.
리플렉션의 타겟이 된 클래스, 함수, 열거자 등은 자신의 이름이나 타입 등, 파악할 수 있는 정보들을 수집해둡니다.
그리고 프로그램이 실행 중 그렇게 수집한 정보를 활용할 수 있게 됩니다.
C++에서는 지원되지 않습니다만, 편리한 기능이므로 일부 언어에서는 언어 레벨에서 지원하기까지 합니다.
지금 다루는 리플렉션을 보면 알 수 있듯, 하이 레벨 프로그래밍 언어의 기능들은 언리얼 엔진에 구현되어 있는 경우가 많습니다.
언리얼은 리플렉션을 위해 자체적으로 C++ 클래스, 구조체, 함수, 멤버 변수, 열거형 관련 정보를 수집, 질의, 조작할 수 있도록 별도의 시스템을 구축하고 있습니다.
이를 언리얼 프로피터 시스템, 혹은 언리얼 리플렉션 시스템이라고 합니다.
물론 불필요한 자원 낭비이기에 모든 요소에 리플렉션을 제공하진 않습니다.
사용자가 해당 요소를 리플렉션 시스템에 노출시켜야 리플렉션을 사용할 수 있도록 구성되어 있습니다.
이미 눈치채셨겠지만, 매크로 함수는 원하는 요소를 리플렉션 시스템에 노출시키기 위한 장치입니다.
그 중 멤버 변수를 리플렉션 시스템에 노출하기 위해서 사용하는 것이 UPROPERTY()입니다.
마킹 시
- 컴파일 시 Unreal Header Tool(UHT)가 리플렉션 정보를 수집
- 가비지 컬렉션에 의해 생명 주기 관리
의 순으로 처리됩니다.
UPROPERTY()
UTempObject* Temp; // 리플렉션 시스템의 GC에 의해 관리됨
메타데이터 지정자를 통한 멤버 변수 권한 설정
UPROPERTY 매크로 함수 내부에 메타데이터 지정자를 지정하여 멤버 변수의 권한을 설정할 수 있습니다.
아래는 그 실 예시입니다.
UPROPERTY(VisibleAnywhere, BlueprintReadWrite) // 이런 형태로 사용합니다.
UTempObject* Temp;
권한의 종류는 아래와 같습니다.
블루프린트에 노출 여부
- BlueprintReadWrite : 블루프린트 창에서 변수를 읽고 쓸 수 있습니다.
- BlueprintReadOnly : 블루프린트 창에서 변수를 읽을 수 있습니다.
에디터 디테일 창에 노출 여부
- EditDefaultsOnly : 디폴트 오브젝트의 디테일 창에서만 변수 값을 수정할 수 있습니다.
- EditInstanceOnly : 오브젝트 인스턴스의 디테일 창에서만 변수 값을 수정할 수 있습니다.
- EditAnywhere : 디폴트 / 인스턴스 구분 없이 디테일 창에서 변수 값을 수정할 수 있습니다.
- VisibleDefaultsOnly : 디폴트 오브젝트의 디테일 창에서만 변수 값을 볼 수 있습니다.
- VisibleInstanceOnly : 오브젝트 인스턴스의 디테일 창에서만 변수 값을 볼 수 있습니다.
- VisibleAnywhere : 디폴트 / 인스턴스 구분 없이 디테일 창에서 변수 값을 볼 수 있습니다.
각각의 예를 들자면 아래처럼 사용하고 표시됩니다.
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = TempTest)
UTempObject* Test1;
UPROPERTY(EditInstanceOnly, BlueprintReadOnly, Category = TempTest)
UTempObject* Test2;
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = TempTest)
UTempObject* Test3;
UPROPERTY(VisibleDefaultsOnly, BlueprintReadOnly, Category = TempTest)
UTempObject* Test4;
UPROPERTY(VisibleInstanceOnly, BlueprintReadOnly, Category = TempTest)
UTempObject* Test5;
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = TempTest)
UTempObject* Test6;
UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category = TempTest)
UTempObject* Test7;
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = TempTest)
UTempObject* Test8;
'개발 > 언리얼 엔진' 카테고리의 다른 글
[UE4] 오브젝트 생성(Create Object) (0) | 2021.09.13 |
---|---|
[UE4] 언리얼 프로퍼티(리플렉션) 시스템(Unreal Property System) (0) | 2021.08.24 |
[UE4] 스마트 포인터(Smart Pointer) (0) | 2021.08.09 |
[UE4] 동기 / 비동기 에셋 로딩 (0) | 2021.07.15 |
[UE4] 에셋 강참조 / 약참조 (0) | 2021.07.13 |