본문 바로가기

프로그래밍/언리얼

언리얼 오브젝트

언리얼 오브젝트

 : 언리얼 엔진의 관리를 받는 특수한 객체. 언리얼 프로젝트에 모든 클래스가 언리얼 오브젝트가 되어야 한다는 것은 아님.

 

이 둘을 구별하기 위해 클래스 이름에 붙은 접두사를 사용한다

언리얼 오브젝트  : U로 시작

일반 C++ 클래스 : F로 시작

 

언리얼 엔진 내에서 객체를 쉽고, 효율적으로 관리하기 위해서 고안되었다

 

C++ 객체가 언리얼 오브젝트가 되면 자동으로 향상되는 기능

 

1. CDO(Class Default Object)

 : 객체의 초기 값을 자체적으로 관리한다

 

2. Reflection

 : 객체 정보를 런타임에서 실시간 조회가 가능하다

 

3. GC(Garbage Collection)

 : 참조되지 않는 객체를 메모리에서 자동 해제할 수 있다

 

4. Serialization

 : 객체와 속성 정보를 통으로 안전하게 보관하고 로딩한다

 

5. Delegate

 : 함수를 묶어서 효과적으로 관리하고 호출할 수 있다

 

6. Replication

 : 네트워크 상에서 객체간에 동기화를 시킬 수 있다

 

7. Editor Integration

 : 언리얼 에디터 인터페이스를 통해 값을 편집할 수 있다

 

언리얼 오브젝트는 C++ 표준이 아니고 언리얼 엔진이 자체적으로 만들어 제공하는 Framework이기 때문에

일반적인 방법으로는 만들 수 없고, 언리얼 헤더 툴(Unreal Header Tool)이라는 프로그램의 도움을 받아야 한다

 

헤더 파일에서 클래스 선언을 언리얼 오브젝트 규격에 맞게 선언해주면

바로 컴파일하는 것이 아니라, 언리얼 헤더 툴이 이를 파싱하고 분석한다

 

헤더파일의 선언이 규격에 맞지 않으면

언리얼 헤더 툴에 의해 에러가 발생된다

 

규격에 맞게 선언했다면

언리얼 헤더 툴은 부가적인 메타 정보를 담은 소스코드를 프로젝트의 Intermediate 폴더에 생성해준다

 

이 작업이 모두 끝나면 컴파일을 진행하게 된다

언리얼 오브젝트의 구성

 

 

언리얼 오브젝트의 선언 규칙

1. 클래스이름.generated.h를 반드시 가장 마지막에 include 시켜줘야 한다

2. 클래스 선언 전에 UCLASS 매크로를 사용해야 한다

3. 언리얼 오브젝트의 접두사는 U,A,S가 있다

    액터 기반이라면 A

    액터 기반이 아니라면 모두 U를 쓰되

    UI를 담당하는 슬레이트S를 사용한다

4. UObject 클래스는 언리얼 오브젝트 최상단에 위치한 기본 클래스이다

    이를 상속받은 클래스는 모두 언리얼 오브젝트가 된다

5. 클래스 선언 내부에 GENERATED_BODY() 매크로도 선언해준다

 

언리얼 오브젝트에 사용하는 추가 매크로

1. 모듈이름_API 매크로상황에 따라 부가 설정을 해주는 매크로이다

  ex) 윈도우 에디터에서 사용할 수 있게 dll로 빌드할 때는 MS의 DLL문법인 __declspec(dllexport)구문으로 자동 치환된다

이렇게 선언해야 다른 모듈에서 현재 모듈 내 클래스에 접근할 수 있게 된다

게임 빌드시에는 굳이 외부에 공개할 필요 없이 모든 모듈이 하나의 exe에 통합되므로 이때는 빈 문자열로 치환된다

2. 언리얼 오브젝트의 생성자오브젝트의 기본 값을 지정하는데 사용된다

    클래스 기본 객체인 CDO를 생성할 때 이 생성자 코드가 한번 실행된다

3. 멤버 변수 위에 UPROPERTY 매크로를 써주면 이 변수는 앞으로 언리얼 엔진의 관리를 받게 된다

    후에 언리얼 오브젝트가 소멸되더라도 언리얼 엔진의 관리를 받아 해당 멤버 변수의 메모리도 같이 자동으로 소멸되고, 메모리 사용량도 체크할 수 있다

4. 멤버 함수 위에 UFUNCTION 매크로를 써주면 블루프린트와 연동되게 할 수 있고, delegate나 replication과 같은 함수를 사용할 수 있어서 멤버 함수의 활용폭이 늘어난다

 

UE_LOG

 : 언리얼에서 로그를 남기게 해주는 매크로

 

UE_LOG(Log Category, Verbosity, Format String)

1. Log Category

 : 로그를 구분할 수 있는 카테고리를 지정한다

    LogClass, LogTemp와 같은 기본 카테고리를 제공하고 있고, 모듈마다 로그를 남길 수 있도록 모듈 별로 대부분 카테고리가 지정되어 있다. 원하는 카테고리를 직접 선언할 수 있다

2. Verbosity

 : Log, Warning, Error로 나뉘며, 흰색 노란색 빨간색으로 표시된다

    Error 타입일 경우 프로그램을 멈출 수 있게 설정하는 것도 가능하다

3. Format String

 : Printf문과 유사하게 사용한다. 뒤에 Variable Argument를 추가할 수 있고, 언리얼이 제공하는 2바이트 문자를 지원하는 TEXT 매크로를 사용해 문자열로 로그를 지정하거나 포맷을 정의한다