게임 개발자를 향해

변수와 UPROPERTY() 메크로 본문

언리얼 엔진/C++

변수와 UPROPERTY() 메크로

뿌단이 2022. 8. 24. 11:04

 이 게시물을 보기 전에 이전 글인 "C++ 생성 과정"을 보고 오면 좋을 것 같습니다.

 

1. 변수

 변수는 변하는 값이며 해당 값을 저장하기 위해 필요한 공간이라고 보면 되겠다. 보통 게임에서 사용하는 변수의 예를 들어보면

  • HP
  • 공격력
  • 닉네임
  • 퀘스트 클리어 유무

등이 있을 것이다.  그럼 이들의 값을 나타내는 자료형은 프로그래밍 언어를 배웠다면 잘 알것이다.

  • int(정수)
  • float(소수)
  • string(문자열)
  • bool(논리)

위와같은 자료형 등이 있다. 이를 이용하여 게임의 변수를 저장할 것이다.

 

2. 언리얼엔진의 자료형

 언리엘 엔진의 자료형은 따로 구현해놓았다. C++에 자료형이 있는데 굳이 만든 이유가 무엇일까? 이유는 바로 운영체제이다. 리눅스, 윈도우, IOS, MacOS, Android 등등 운영체제 혹은 프로그래밍 언어 등 플랫폼 마다 자료형의 저장공간 크기가 달라질 수 있다.

 

 Window로 간단한 예를 들어보면 Win32bit 의 운영체제의 long 자료형의 크기는 4Byte 였다. 하지만 최근 사용되어지는 Win64bit의 운영체제의 long 자료형의 크기는 8Byte이다. 만약 64bit의 운영체제로 만든 게임이 32bit 운영체제로 실행한다면 기존 자료형의 데이터 크기보다 작아 overflow가 발생하여 게임에 오류가 발생할 수 있다.

 

 이 문제를 해결하기 위해 언리얼엔진은 본인들 만의 자료형을 직접 만들어서 관리하고있다. 종류는 아래와 같다.

 

자료형 크기
int8 8bit(-128 ~ 127)
int16 16bit(-32,768 ~ 32,767)
int32 32bit(-2,147,483,648 ~ 2,147,483,647)
int64 64bit(-922경... ~ 922경...)
uint8 8bit(0 ~ 255)
uint16 16bit(0 ~ 65535)
uint32 32bit(0 ~ 4,294,967,295)
uint64 64bit(0 ~ 18경...)
float 4Byte(32bit)
double 8Byte(64bit)
FString 문자열
bool   0, 1

 

 1) 정수타입

 위 표처럼 정수타입은 쓰여질 숫자범위에 따라 자료형을 사용해주면 된다.

 

2) String

 보통 C++ 에서는 문자열을 std::string을 사용하고 Unity 의 C#에서는 String 클래스를 사용한다. 하지만 언리얼에서는 필요에 따라서 여러가지 문자열을 제공해주고있다. 기본적으로 "FString"이라는 문자열이 있다. 저장되는 글자의 수에 따라서 변수의 길이가 자동으로변하는 기본 C++의 std:string과 유사하게 동작한다. 보통 C++의 std:string에 문자열을 넣을 땐 " "(큰 따옴표)를 사용하여 넣지만, "FString"에서는 TEXT("") 메크로를 사용해야한다. 이외에도 현지화 텍스트를 위해서 사용하는 "FText"나 자주사용되는 문자열을 식별자로 지정해서 문자열을 비교할 떄 소모되는 메모리와 CPU 시간을 절약하는 "FName" 플랫폼마다 다를 수 있는 문자열 세트와 상관없이 문자열을 저장하는 용도로 사용하는 "TCHAR" 가 있다.

 

3) 소수 및 논리자료형

 소수와 논리자료형은 C++와 똑같이 사용하면 된다.

 

4) 자료형을 정할 때 고려사항

 언리얼의 int 자료형을 보면 크기는 두 배씩 메모리가 증가하기 때문에 게임의 최적화를 고려하여 적절한 자료형을 사용하는것이 중요하다. 그리고 게임은 double 자료형을 쓸 정도의 소수단위는 필요하지 않기 때문에 보통은 float을 사용한다.

 

3. UPROPERTY()

 

헤더파일에 선언된 Class에 변수를 선언한다.(C++ 파일 생성하는 법을 모른다면  "")

 

 선언 중 UPROPERTY() 라는 함수가 보일 것이다. Unity는 변수를 public으로 지정하면  유니티의 인스펙터 뷰에 공개가 된다. 인스펙터뷰는 언리얼로 치면 디테일 패널이다. 하지만 언리얼은 스크립트에서 변수를 public으로 지정한다 해서 디테일 패널에 보이지 않는다.

 

<디테일 패널의 예시>

 위 디테일 패널처럼 값을 편리하게 바꾸기 위해선 변수 선언 혹은 함수 선언 위에 UPROPERTY() 함수를 붙이면 된다.

property란 위 디테일 패널에서 조작할 수 있는 변수를  property라고 부른다.  UPROPERTY() 에는 파라메터값이 보일 것이다. 이는 property의 카테고리와 변수마다 변경할 수 있는 값인지 없는 값인지 등의 제어를 할 수 있다.

public아래에 선언한 것은 디테일 패널에서도 변수를 조작할 수 있게 해준 것이다.

 

 이제  UPROPERTY()의 파라메터 값의 의미를 알아보도록 하자.

 

EditAnywhere : 아키타입과 레벨의 배치된 인스턴스 양쪽 모두의 property 창에서 편집을 허용한다.

(아키타입: 아직 인스턴스화 되지 않은 블루프린트의 원본을 의미한다.)

 

BlueprintReadWrite : property 블루프린트에서 읽기 쓰기가 가능하다.

 

Category = " " : 블루프린트 편집툴이나 디테일 패널에서 이 property를 데미지라는 카테고리로 묶어서 보여준다.

 

BlueprintReadOnly : property를 블루프린트에서 읽기만 가능하게 해준다.

 

VisibleAnywhere : property를 모든 property 창에서 보이지만 편집할 수 없게 한다.

 

Transient : 해당 property가 휘발성 프로퍼티로 저장되지 않음을 의미한다.

(이해는 안가지만 일단 보류)

 

AMyActor::AMyActor() : TotalDamage(200), DamageTimeInSeconds(1.0f), DamagePerSecond(200.0f)
{

	PrimaryActorTick.bCanEverTick = true;
	
}

 

헤더파일에 변수 선언을 완료했다면, cpp파일에 위 코드와 같이 생성자 함수에 선언한 변수값을 초기화해준다.

 

이후 언리얼에서 컴파일을 해주고 생성한 C++파일을 월드에 배치하면 월드 아웃라이너에서 C++ 파일을 클릭하면

아래와같이 디테일패널이 나올 것이다.

<C++파일인 MyActor1의 디테일 패널>

 

안녕하세요!  뿌단이 입니다!! 게임 개발의 길.. 쉽지 않네용..

저와 같은 길을 가시는 분들 많은 텐데 언리얼에 대해 정보가 많지 않죠? ㅠㅠ

저도 초짜지만 이렇게라도 지식공유를 하고 싶어 블로그를 개설했습니다!

블로그를 처음 써봐서 부족하지만 앞으로 좀더 쉽게 설명 하도록 노력 하겠습니다!

읽어주셔서 감사합니다!!

 

 

<참고자료>

-베르의 게임개발 유튜브

https://www.youtube.com/watch?v=SGrH9vZUWDk