오브젝트

기본 게임플레이 요소인 Actor 와 Object 에 대한 설명입니다.

Choose your operating system:

Windows

macOS

Linux

언리얼에는 게임 오브젝트 처리용 탄탄한 시스템이 있습니다. 언리얼에서 오브젝트의 베이스 클래스는 UObject 입니다. UObject 에서 파생되는 클래스에 UCLASS 매크로를 사용하여 태그를 해 주면 UObject 처리 시스템에서 인식하게 됩니다.

UCLASS 매크로

UClass 매크로는 UObject 에게 자신의 언리얼에서 기반으로 삼은 유형에 대해 설명해 주는 UClass 로의 레퍼런스를 넘겨줍니다. 각 UClass 는 Class Default Object, 줄여서 CDO 라 불리는 오브젝트를 하나 유지합니다. CDO 는 본질적으로 기본 "템플릿" 오브젝트로, 클래스 생성자에 의해 생성된 이후 변경되지 않습니다. 주어진 오브젝트 인스턴스에 대해 UClass 와 CDO 둘 다 구할 수는 있지만, 일반적으로는 읽기 전용으로 간주되어야 합니다. 오브젝트 인스턴스에 대한 UClass 는 GetClass() 함수를 사용하여 언제든 접근 가능합니다.

UClass 에는 클래스를 정의하는 프로퍼티와 함수 세트가 들어있습니다. 이들은 네이티브 코드에서 사용할 수 있는 일반 C++ 함수와 변수이지만, 오브젝트 시스템 안에서의 동작을 제어하는 언리얼 전용 메타데이터가 붙어 있습니다. 태그 시스템 관련 상세 정보는 언리얼 아키텍처 문서를 참고해 주시기 바랍니다.

참고로 UObject 클래스는 그에 상응하는 UClass 에는 존재하지 않는 네이티브 전용 프로퍼티를 포함할 수도 있습니다.

프로퍼티와 함수 유형

UObject 는 (프로퍼티라 알려진) 멤버 변수 또는 어떤 유형의 함수도 가질 수 있습니다. 그러나, 언리얼 엔진에서 그러한 변수나 함수를 인식하고 조작할 수 있도록 하기 위해서는, 반드시 특수한 매크로로 마킹하여 특정 유형 표준에 맞춰줘야 합니다. 그러한 표준 관련 자세한 내용은, 프로퍼티 , UFunction 문서를 참고하시기 바랍니다.

오브젝트 생성

new UObject 인스턴스는 물론 그 표준 new 연산자를 만드는 데도 사용할 수 있는 함수가 여럿 있으며, 각각의 용례는 다음과 같습니다:

메서드

설명

NewObject<class>()

자동 생성되는 이름으로 새 인스턴스를 만듭니다. 단순한 클래스를 생성할 때 자주 쓰이는 방법입니다.

NewNamedObject<class>()

지정된 이름과 함께 약간의 파라미터 옵션으로 새 인스턴스를 만듭니다. 이름이 새 인스턴스의 Outer 와 충돌하는 경우 어서트가 발생합니다.

ConstructObject<class>()

가능한 모든 생성 옵션으로 새 인스턴스를 만듭니다. 유연성이 필요한 때만 사용합니다.

new

생성자가 인수를 필요로 할 때와 같이, 특정 로우 레벨 환경에서 오브젝트를 생성할 때 사용합니다.

게임플레이용 UObject 클래스 인스턴스 생성을 위한 여러가지 메서드 관련 상세 정보는 UObject 인스턴스 생성 문서를 참고하세요.

UObject 에 제공되는 함수성

모든 경우에 이 시스템을 사용하는 것이 필수적이지도 심지어 적절하지도 않지만, 그렇게 해 주면 다음과 같은 장점이 있습니다:

  • 가비지 컬렉션

  • 레퍼런스 업데이트

  • 리플렉션

  • 시리얼라이제이션

  • 디폴트 프로퍼티 변경사항 자동 업데이트

  • 자동 프로퍼티 초기화

  • 자동 에디터 통합

  • 실행시간에 유형 정보 사용가능

  • 네트워크 리플리케이션

이들 각 시스템에 대한 상세 정보는 언리얼 오브젝트 처리 문서를 참고하세요.

언리얼 헤더 툴

UObject 파생 유형에 제공되는 함수성을 활용하기 위해서는, 해당 유형에 대해 헤더 파일에서 전처리 단계를 거쳐 줘야 필요한 정보를 수집할 수 있습니다. 이러한 전처리 단계는 Unreal Header Tool (언리얼 헤더 툴), 줄여서 UHT 에서 이루어집니다.

UObject 파생 유형은 준수해야 하는 특정 구조체가 있는데, 그에 대한 것을 여기에 다루겠습니다.

헤더 파일 포맷

소스 (.cpp) 파일의 UObject 구현이 다른 C++ 클래스와 똑같이 이루어지기는 하지만, 헤더 (.h) 파일의 정의는 특정 기본 구조를 준수해야 언리얼 엔진 4 에서 정상 작동합니다. 에디터의 "새 C++ 클래스" 명령이 제대로 된 포맷의 헤더 파일을 구성하기에 가장 쉬운 방법입니다. UObject 파생 클래스에 대한 기본 헤더 파일은, UObject 의 파생형이 UMyObject 이고, MyProject 라는 프로젝트에서 생성되었다 가정할 때, 다음과 같아 보일 것입니다:

#pragma once

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

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

};

이에 대한 언리얼쪽 부분은 다음과 같습니다:

#include "MyObject.generated.h"

이 줄은 파일의 마지막 #include 지시자일 것으로 기대됩니다. 이 헤더 파일이 다른 클래스에 대해 알아야 하는 경우, 파일 내 어디서도 앞서 선언 가능하며, 위의 MyObject.generated.h 에 포함시킬 수도 있습니다.

UCLASS()

UCLASS 매크로는 UMyObject 를 언리얼 엔진 4 에 보이도록 만듭니다. 이 매크로는 다양한 클래스 지정자 지원을 통해 클래스에 어떤 기능을 켜고 끌 지 결정할 수 있습니다.

class MYPROJECT_API UMyObject : public UObject

MyProject 가 UMyObject 클래스를 다른 모듈에 노출시키고자 한다면, MYPROJECT_API 지정이 필수입니다. 게임 프로젝트에 포함시킬 모듈이나 플러그인에 가장 좋으며, 의도적으로 다수의 프로젝트에 클래스를 노출시켜 기동성있는 자체 독립적인 함수성을 제공하고자 하는 경우에도 좋습니다.

GENERATED_BODY()

GENERATED_BODY 매크로는 인수를 받지 않으나, 클래스가 엔진에 필요한 인프라 스트럭처를 지원하도록 구성합니다. 모든 UCLASS 에 필수입니다. 참고로 GENERATED_BODY 매크로는 현재 엔진 버전에서 멤버 액세스 레벨을 언어 기본값인 private 으로 설정하기 보다는 public 으로 설정합니다.

오브젝트 업데이트

Tick (틱)이란 언리얼 엔진에서 오브젝트가 어떻게 업데이트되는지를 일컫습니다. 모든 오브젝트는 매 프레임마다 틱 가능해서, 필요한 동작이나 계산을 업데이트할 수 있습니다.

Object 에는 내장된 업데이트 기능이 없습니다만, inherits 클래스 지정자를 사용하여 FTickableGameObject 클래스를 상속받음으로써 필요에 따라 추가시킬 수는 있습니다. 그런 다음 Tick() 함수를 구현하면 엔진에 의해 매 프레임마다 호출됩니다. 참고로 대부분의 게임내 오브젝트는 액터 일 것이므로, 프레임당 한 번이 아닌 사용자 설정 최소 간격마다 틱이 가능합니다.

오브젝트 소멸

참고로 약 포인터 는 오브젝트 가비지 컬렉션 여부에 영향을 주지 않습니다.

오브젝트 소멸 처리는 오브젝트가 엔진에 더이상 레퍼런스되지 않을 때 가비지 컬렉션 시스템에 의해 자동으로 이루어집니다. 즉 어떤 UPROPERTY 포인터나, 엔진 컨테이너나, ( TArray<UObject*> 또는 TWeakPtr<UObject*> 와 같은) 스마트 포인터 클래스도 강 레퍼런스를 갖지 않는 액터에 대해 일어난다는 뜻입니다. 가비지 컬렉터가 실행되면, 검색된 것 중 레퍼런스가 없는 오브젝트는 삭제될 것입니다. 추가로, MarkPendingKill() 함수를 오브젝트에서 바로 호출할 수 있는데, 그러면 해당 오브젝트로의 모든 포인터는 NULL 로 설정되고 글로벌 검색에서도 제거됩니다. 마찬가지로 이 오브젝트는 다음 가비지 컬렉션 패스에서 완전히 삭제될 것입니다.

언리얼 엔진 문서의 미래를 함께 만들어주세요! 더 나은 서비스를 제공할 수 있도록 문서 사용에 대한 피드백을 주세요.
설문조사에 참여해 주세요
건너뛰기