UPROPERTY()

UPROPERTY()는 변수에 붙는 리플렉션 메크로입니다, 위 코드 처럼 UPROPERTY() 메크로에 인자 값을 넣어서 용도에 맞게 활용 할 수 있습니다.

 

내부에 들어가는 인자 스타일은 제가 자주 쓰는 것 기준으로 크게 4가지 스타일이 있으며 순서대로 작성해보겠습니다.

분류한 스타일은 따로 자료가 없어서 제가 임의로 명칭했습니다.

 

https://docs.unrealengine.com/ko/Programming/UnrealArchitecture/Reference/Properties/index.html

 

프로퍼티

게임플레이 클래스에 대한 프로퍼티 생성 및 구현 관련 레퍼런스입니다.

docs.unrealengine.com

해당 포스팅에서는 제 기준으로 자주 사용하는 것을 작성하며 그외 수많은 다른 설정 값을 위 페이지에서 확인하면 되겠습니다.

 

 


1. 변수 공개 & 수정 권한

인자값 순서는 상관없지만 제가 보통 맨 앞에 넣는 값입니다.

 

VisibleDefaultsOnly

VisibleInstanceOnly

VisibleAnywhere

 

EditDefulatOnly

EditInstanceOnly

EditAnywhere

 

위 6가지 값중 1개를 설정 할 수 있습니다.

 

헤더파일에서 위 처럼 변수를 작성합니다.

 

간단하게 표로 요약하면 아래와 같습니다.

  Edit Visible
DefaultsOnly 블루프린트 에디터 창의 디테일 패널에서 값을 수정 가능 블루프린트 에디터 창의 디테일 패널에서 값을 보기 가능
InstanceOnly 월드상에 배치된 오브젝트의 디테일 패널에서 값을 수정 가능 월드상에 배치된 오브젝트의 디테일 패널에서 값을 보기 가능
Anywhere 블루프린트 에디터 & 월드상에 배치된 오브젝트의 디테일 패널에서 값을 수정 가능 블루프린트 에디터 & 월드상에 배치된 오브젝트의 디테일 패널에서 값을 보기 가능

 

- Visible과 Edit의 차이

우선 Edit와 Visible의 차이는 위와 같습니다, 일반 변수는 단순하게 보기, 수정으로 생각하면 되지만 클래스를 참조하는 포인터 변수는 좀 이야기가 달라지는데 이 주제는 좀 뒤에 다루겠습니다.

 

 

- DefaultsOnly, InstanceOnly, Anywhere의 차이

DefaultsOnly는 위 사진 처럼 블루프린트 에디터에서 값을 볼 수 있습니다.

 

InstanceOnly는 월드에 배치된 오브젝트의 디테일 패널에서 값을 볼 수 있습니다.

 

 

Anywhere는 블루프린트 에디터, 월드 둘다 볼 수 있습니다.

 

 

 

- 포인터 변수에 사용할 때

포인터 변수를 만들어 놓고 수정하고 싶다고 Edit를 사용하면 위 처럼 의도하지 않은 결과가 나옵니다,

원인은 해당 클래스를 수정하는 것이 아닌 포인터 변수의 참조를 수정하게 되기 때문에 위 처럼 참조를 변경하는 메뉴가 뜨게 됩니다.

 

 

Visible로 했을때 의도한 대로 해당 StaticMesh클래스의 정보를 수정할 수 있게 되었습니다.

 

 

 

 


2. 블루프린트 공개 & 수정 권한

두 번째 인자값 입니다, 블루프린트와 직접적으로 연관된 부분입니다.

 

BlueprintReadOnly 블루프린트에서 해당 변수를 읽기가 가능합니다.
BlueprintReadWrite 블루프린트에서 해당 변수를 읽기 & 쓰기가 가능합니다.
BlueprintGetter 해당 변수에 접근 할 수 있는 함수를 지정하고 블루프린트는 해당 함수를 통해 변수에 접근합니다.
BlueprintSetter 해당 변수에 수정 할 수 있는 함수를 지정하고 블루프린트는 해당 함수를 통해 변수에 수정합니다.

 

ReadOnly나 ReadWrite를 사용하면 블루프린트 에디터의 변수 패널에 변수를 확인 할 수 있습니다.

 

만약 보이지 않으면 패널의 우측 상단에 눈알 아이콘을 누르고 상속된 변수 표시를 체크하면 변수를 확인 할 수 있습니다.

 

 

- BlueprintReadOnly & BlueprintReadWrite

ReadOnly와 ReadWrite는 단순하게 블루프린트 내에서 해당 변수를 Get만 가능하먄 Get &Set 둘다 가능하냐 차이 입니다.

 

 

 

- BlueprintGetter & Setter

	UPROPERTY(EditAnywhere, BlueprintGetter = GetTestValueGS, BlueprintSetter = SetTestValueGS)
		float m_TestValue_GS = 3.0f;

	UFUNCTION(BlueprintGetter)
		float GetTestValueGS()
	{
		return m_TestValue_GS + 20.0f;
	}

	UFUNCTION(BlueprintSetter)
	void SetTestValueGS(float fValue)
	{
		m_TestValue_GS += fValue + 100.0f;
	}

C#의 Gettset & Setter와 같은 기능을 가졌으며 간단히 말하면 Get, Set을 커스텀 함수로 만들어 사용 할 수 있습니다.

 

특이 사항은 Settter함수를 사용 할 떄 자동으로 Getter함수까지 호출 됩니다.

위 코드와 같이 작성하고 블루프린트에서 값을 출력해 보겠습니다.

 

위와 같이 블루프린트 노드를 만들고 값을 확인하니

123.0이 뜨게 됩니다. 그 이유는 Getter가 자동으로 호출되서 기본값 3.0 + Getter 20.0f + Setter + 100.0f로 프로세스가 진행되서 위와 같은 결과가 나옵니다.

 

Getter를 제거하면 

 

커스텀 Getter함수가 호출되지 않고 내장된 Getter함수가 대신 호출되어 103.0이 출력됩니다.

 

 

 

 


Category

Category는 위 처럼 디테일패널의 항목 이름을 명칭 할 수 있습니다.

 

상위명칭 | 하위명칭으로 위 처럼 작성하면 상하위 카테고리를 명칭 할 수 있습니다.

 

 

 


Meta

Meta 키워드는 Metadata 지정자라고 하며 에디터 관련 다양한 기능을 구현 할 수 있습니다.

 

위 처럼 변수가 private으로 되어 있지만 "meta = (AllowPrivateAccess = "true")"명령어를 사용하여 에디터에서 보이게 할 수 있고

 

위 처럼 다른 명령어도 합쳐서 사용이 가능합니다, 위 코드에 사용한 UIMin, UIMax는 에디터에서 조정할 수 있는 숫자 범위를 지정하는 명령어입니다.

 

이외에도 다양한 Metadata 명령어가 있습니다.

 

https://docs.unrealengine.com/ko/Programming/UnrealArchitecture/Reference/Metadata/index.html

 

메타데이터 지정자

Metadata 키워드는 UClass, UFunction, UProperty, UEnum, UInterface 를 선언할 때 사용되며, 엔진 및 에디터 다양한 부분과의 작동방식을 지정하는 데 사용됩니다.

docs.unrealengine.com

 

 

 


그 외 기능

- Display

SimpleDisplay와 AdvancedDisplay입니다. 위 사진과 같이 SimpleDisplay는 이전에 썼던 변수와 같고 AdvancedDisplay를 사용하면 화살표를 통해 접었다가 펼칠 수 있습니다.

 

 

- 주석

UPROPERTY 메크로 위에 주석을 써놓으면 에디터에서 마우스를 올리면 위 처럼 주석내용을 볼 수 있습니다,

(4.23 기준으로 한글이 안됩니다.)

 

 

 


WRITTEN BY
CatDarkGame
Technical Artist dhwlgn12@gmail.com

,