언리얼엔진

[C++] 리플렉션 / UPROPERTY()

찬이2 2023. 9. 6. 01:29

Tip!!

* VS에서 빌드 했는데 오류가 발생하여 실패한다면, 출력창을 확인해보자.

* Ctrl + M + M : VS에서 /* ~ */ 주석처리한 부분을 열고 닫는 단축키

* Ctrl + Shitf + U : VS에서 지정한 문자 전부 대문자 전환

* Ctrl + U : VS에서 지정한 문자 전부 소문자 전환


리플렉션(Reflection)

코드로 작성한 내용을 그대로 언리얼 에디터 블루프린트에 반영시키는 것이다.

런타임에 프로그램이 자기자신을 조사할 수 있게 하는 기능.

언리얼 매크로를 통해서 반영하고 있다.

 

UPROPERTY(...)

변수에서 사용할 수 있다. 괄호 안에 들어가는 태그는 대소문자 구분할 필요는 없다.

UPROPERTY(...) //여기 괄호 안에 여러가지 내용이 태그된다
	UStaticMeshComponent* Mesh;
    
UPROPERTY(EditDefaultsOnly)     int32 i;
UPROPERTY(VisibleInstanceOnly)  int32 j;
UPROPERTY(BlueprintReadOnly)    int32 k;
UPROPERTY(BlueprintReadWrite)   int32 l;

UPROPERTY(BlueprintReadOnly, Category = "Test") int32 n;

- EditAnywhere : 어디서든 수정(Edit)이 가능함. 제일 느슨한 경우이다.

                             이 태그를 사용하면 블루프린트 내에서 Component의 디테일에 접근되어 수정이 가능하다.

                             때문에 블루프린트에서 StaticMesh 지정이 가능해진다.

 

- VisibleAnywhere : 어디서든 볼 수 있지만 수정은 할 수 없다.

                                  EditAnywhere는 광범위한 권한으로 인해 인스턴스에서도 Component 자체를 변경할 수도 있는

                                  접근성에 문제가 발생한다. 따라서 컴포넌트 계열은 Visible로 수정하는게 좋다.

 

- EditDefaultsOnly : 클래스 디폴트에서만 값을 볼 수 있고 수정이 가능하다.

 

- VisibleInstanceOnly : 레벨에 배치된 인스턴스에서만 값을 볼 수 있고, 수정은 불가능하다.

 

- BlueprintReadOnly : 블루프린트에서 상속된 변수로 볼 수 있고, 이벤트그래프에서 읽기(Getter)만 사용할 수 있다.

 

- BlueprintReadWrite : 블루프린트에서 상속된 변수로 볼 수 있고, 읽기/수정(Getter/Setter)이 가능하다.

 

- Category = "문자열" : 해당 변수의 카테고리 지정 가능. "문자열 | 문자열"의 사용도 가능.

 

* Edit : 변수 타입 자체(클래스 자체)를 변경할 수도 있다.

* Write : 변수 내의 값(주소)를 변경할 수 있다.

 

* UPROPERTY()의 태그로 여러개를 넣어줄 수 있는데, 보통 변수들은 블루프린트에서 Getter/Setter를 사용하기 위해선 BlueprintRead / Write 태그가 추가로 필요하다.

하지만 컴포넌트는 태그가 없어도 Getter/Setter가 사용가능한데, 경고가 발생하니 사용하려면 태그를 추가해주자.


* 언리얼 C++에서 정수를 int32로 표현한다. (32bit == 4byte) 여기서 int32를 사용하는 이유는 뭘까?

통합개발환경(IDE, Integrated Development Environment)

언리얼에서는 빌드가능한 플랫폼이 여러개 있다. 그래서 각각의 개발환경(컴파일러)마다 번역하는 방식이 달라진다.

그런데 컴파일러마다 정확한 크기를 정해두지 않아서 시스템마다 제각각이다.

그래서 멀티플랫폼을 염두해둔 프로젝트들은 타입들을 재정의하여 사용한다.


* 만약 상속받은 자식은 접근할 수 없지만, 블루프린트로 사용할 수 있도록 하고 싶다면?

먼저 상속받은 자식이 접근할 수 없게 하고싶다면 private: 를 사용하면 된다.

하지만 private 사용 시 블루프린트로 사용할 수가 없어진다.

priavte:
	UPROPERTY(BlueprintReadOnly, Meta = (AllowPriavteAccess)) int32 m;

그래서 Meta 태그를 사용하게 되면 private이지만, 접근이 가능하도록 바뀐다.

Meta에 해당하는 태그는 ()안에 입력한다. 

 


UCLASS()
class GPC_CPP_12_API ACube : public AActor

언리얼 C++에선 Abstract(추상화)같은 것은 반드시 UCLASS() 괄호 안에서 지정해주어야만 한다.

언리얼에서는 UObject 계열의 클래스들은 꼭 한번씩 인스턴스 생성을 한다.

하지만 class 자체에 Abstract를 걸어버리면 인스턴스 생성이 불가능해지기 때문에 문제가 발생한다.

따라서 UCLASS() 내에 걸어주도록 하자.