* 정의

 

언리얼 엔진에서 게임 객체는 UObject라는 클래스의 객체로 표현된다. Actor와 함께(Actor도 UObject이다.) 게임 플레이 요소 중에 가장 기초적인 요소라고 할 수 있다. UCLASS 매크로를 사용하여 UObject에서 파생된 클래스의 태그를 지정할 수 있다.

 

 

* 동작 방식

 

- UObject의 기능

 

UObject는 다음과 같은 기능에서 효율적으로 사용될 수 있다.

 

  • Garbage collection
  • Reference updating
  • Reflection
  • Serialization
  • Automatic updating of default property changes
  • Automatic property initialization
  • Automatic editor integration
  • Type information available at runtime
  • Network replication

 

 

- UClass와 CDO(Class Default Object)

 

@ 정의

// UObject를 UObject 종류(언리얼 오브젝트)라고 간주하고 작성

UClass는 UObject에 대한 클래스를 정의하는 변수들과 함수들의 집합으로 구성되어 있다. 여기서 말하는 변수와 함수는 일반적인 C++ 함수와 변수이지만  객체 시스템에서 동작 방식을 제어하는 언리얼 전용 메타데이터로 태그가 지정되어있다. 간단히 정리하면 클래스 계층 구조 정보, 변수, 함수에 대한 정보를 기록하고 있는 메타 데이터이다.

 

CDO는 UObject 객체의 속성, 컴포넌트 등의 값들이 기본 값으로 설정되어 있는 클래스 기본 객체를 의미한다.

 

UClass와 CDO 모두 해당 객체 인스턴스에서 접근할 수 있지만 일반적으로 읽기 전용이다. UClass는  UObject 객체에서 GetClass()를 통해 접근할 수 있다. 

 

 

@ 생성 과정

엔진이 초기화될 때 클래스의 UClass 객체가 만들어지고 이 과정에서 기본 값들을 설정한 UObject의 생성자가 호출되어 CDO를 같이 생성한다. UClass는 CDO를 포함하고 있으며, 생성된 CDO를 수정되지 않은 상태로 유지된다.

 

 

@ 주의 사항

UObject의 생성자는 CDO 생성 목적으로 엔진 초기화 시점에 한번 호출되고 게임플레이에서는 사용되지 않기 때문에 레벨을 포함한 많은 객체들은 생성자 호출 시점에 존재하지 않을 것이다. 따라서 생성자 내부에서 객체를 사용하거나 게임플레이 코드를 넣으면 안된다. 이러한 코드는 다양한 시점에서 호출되는 제공되는 함수(BeginPlay 등)에서 작성되어야 한다.

 

 

- UCLASS, UPROPERTY, UFUNCTION 매크로

 

UCLASS 매크로는 UObject에 언리얼 기반 타입을 설명하는 UClass 참조를 제공하며 UObject를 사용하기 위해 필요한 매크로다.

 

UObject의 멤버 변수와 함수는 언리얼 엔진이 인식할 수 있게 설정할 수 있는데, 이는 UPROPERTY와 UFUNCTION과 같은 특별한 매크로를 사용함으로써 가능하다.

 

 

- 헤더 파일 형식

 

위에서 설명한 기능을 활용하기 위해서는 UHT(UnrealHeaderTool)이 전처리 과정을 수행할 때 정보를 수집할 수 있도록 특정한 형태를 갖춰야 한다.

 

헤더 파일에 이러한 형태를 적절하기 갖춰야 하는데, 가장 쉽게 에디터를 통해 클래스를 생성하면 기본적인 형태를 알 수 있다.  (UObject 파생 클래스 이름을 MyObject, 프로젝트 이름을 MyProject라고 가정하자.)

#pragma once

#include 'Object.h'
#include 'MyObject.generated.h'

/**
 * 
 */
UCLASS()
class MYPROJECT_API UMyObject : public UObject
{
    GENERATED_BODY()

};

 

@ generated.h : 클래스 생성 시 만들어지는 헤더로 여러가지 매크로를 정의하고 있다. 이러한 매크로는 언리얼 헤더 툴에 의해 파싱되어 코드로 변환되어 StaticClass, typedef Super, ThisClass 등과 같은 기본적인 함수를 제공하게 된다. include하는 파일 중에 가장 마지막에 작성해야한다.

#include "MyObject.generated.h"

 

@ UCLASS : 이 매크로는 언리얼 엔진이 이 클래스를 인식할 수 있도록 하는 역할을 한다. 여러 클래스 속성 지정자를 지원하고 있다.

UCLASS()

 

@ MYPROJECT_API : UMyObject를 다른 모듈에도 노출시키고 싶을 때 필요하다. 모듈 구현이나 플러그인에서 유용하게 사용된다.

class MYPROJECT_API UMyObject : public UObject

 

@ GENERATED_BODY : generated 헤더에서 정의된 매크로를 사용하여 여러 기본적인 기능을 제공한다. 클래스 내에 작성되어야 한다.

GENERATED_BODY()

 

 

- 생석과 삭제

 

NewObject() 팩토리 함수를 통해 간단히 생성될 수 있다.

 

UPROPERTY 매크로를 사용하는 UObject는 가비지컬렉션의 관리를 받게 된다. 이는 더 이상 사용되지 않는(참조되는 않는) 객체는 자동으로 처리된다는 것을 의미한다. MarkPendingKill 함수가 호출 되면 모든 객체에 대한 포인터를 NULL로 만들고 Global Searches에서 제거하게 된다. 이 후 다음 가비지컬렉션 사이클에서 삭제된다.

 

 

+ Recent posts