게임 개발/언리얼 C++

언리얼C++ - 언리얼 오브젝트 기초

싹난 감자 2024. 11. 11. 21:41

 

게임 프로그래밍의 특수성

단일 컴퓨터에서의 최대 성능 발휘, 방대하고 복잡한 기능을 안정적으로 관리

 

C++

  • 안정성보다 성능 중시
  • 메모리 직접 제어
  • Cache 활용 극대화
  • 저수준 API 직접 호출
  • 복사 작업의 최소화

후발 주자 언어(JAVA, C#)

  • 안정성 중시
  • 유지보수성 향상
  • 크래시로부터 보호
  • 자동 메모리 관리
  • 고질적 실수 예방

시간이 지날수록 모던 객체 지향 설계의 중요성이 높아짐

성능을 위해 기존 C++를 포기할 수 없었기 때문에 언리얼에서 C++의 매크로 기능을 사용해

기존 C++를 확장해 모던 객체지향 설계가 가능하도록 만듦.

 

언리얼 C++

  • 메모리 직접 제어
  • Cache 활용 극대화
  • 저수준 API 직접 호출
  • 복사 작업 최소화
  • 유지보수성 향상
  • 크래시로부터 보호
  • 자동 메모리 관리
  • 고질적 실수 예방

자체적으로 새로운 시스템 구축


언리얼 오브젝트

언리얼 엔진이 설계한 새로운 시스템의 단위 오브젝트(객체)

  • 기존 C++ 오브젝트에 모던 객체지향 설계를 위한 다양한 기능을 추가한 오브젝트
  • 일단 C++ 오브젝트와 언리얼 오브젝트의 두 객체를 모두 사용 가능
  • 구분을 위해 일반 C++ 오브젝트는 접두사 F, 언리얼 오브젝트는 접두사 U 사용

각 오브젝트의 사용 용도

  • C++ 오브젝트 : 저수준의 빠른 처리를 위한 기능 구현
  • 언리얼 오브젝트 : 콘텐츠 제작에 관련된 복잡한 설계 구현에 사용

언리얼 오브젝트가 가지는 특징

  • 클래스 기본 객체(CDO): 클래스의 기본 값과 타입 정보의 제공
  • 리플렉션(Reflection): 런타임에서 클래스 정보의 참조 기능
  • 인터페이스(Interface): 모던 객체지향 언어가 제공하는 인터페이스의 제공
  • 향상된 열거형: 보다 향상된 열거형의 지원
  • 델리게이트(Deligate): 객체간의 결합을 낮출 수 있는 델리게이트 기능의 제공
  • 가비지 컬렉션(Garbage Collection): 자동 메모리 관리
  • 향상된 구조체(Struct): 리플렉션이 가능한 구조체의 지원
  • 직렬화(Serialization): 객체 정보를 바이트 스트림으로 저장, 전송, 불러들이는 기능

UObject

언리얼에서 오브젝트의 베이스 클래스는 UObject이다.

UObject에서 파생되는 클래스에는 UCALSS 매크로를 사용하여 태그해주어야 UObject 처리 시스템에서 인식하게 됨

오브젝트를 생성하기 위한 명령어

NewObject, NewNamedObject, ConstructObject, New


#pragma once

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

/**
*
*/
UCLASS() //언리얼 오브젝트임을 알리는 선언
//UNREALOBEJCT_API (프로젝트이름_API) :
//다른 DLL, 다른 모듈에서도 MyObject를 사용할 수 있게 개방해주는 것
//없애면 해당 모듈 내에서만 사용할 수 있다
class UNREALOBEJCT_API UMyObject : public UObject
{
	GENERATED_BODY() 
};

GENERATED_BODY()

GENERATED_BODY의 내용(ObjectMacros.h)

BODY_MACRO_COMBINE 내부의 (CURRENT_FILE_ID, _, __LINE(라인정보)__, _GENERATED_BODY)

를 매크로가 가지고 있는 토큰(##)을 사용해 하나의 긴 단어로 만듦.

MyObject.generated.h에서 사용되며

#include 'MyObject.generated.h'의 generated.h는 복잡한 경로를 따라 숨겨져있음

CURRENT_FILE_ID, _, __LINE(라인정보)__, _GENERATED_BODY을 연결해 긴 단어가 만들어짐

#include 'MyObject.generated.h'은 해당 부분의 내용을 사용하겠다라는 의미

해당 부분의 하위에는 또 다시 재정의되어있음

라인 정보가 변경되거나 MyObject.generated.h가 삭제되더라도 컴파일 과정에서 수정되고 다시 생성됨

헤더 parsing → UnrealHeaderTool(UHT) 실행 → UHT가 헤더에 선언된 내용을 분석하고 매크로들을 참조해 .generated.h 파일을 생성.

.generated.h 파일이 없으면 include가 불가능하고, 제대로 된 C++ 프로젝트가 아니게 됨.

언리얼 오브젝트는 코드를 분석하는 단계가 있어 바로 컴파일 되지 않고 UHT에 의해 소스 코드를 생성하고 자동으로 생성된 코드를 포함해 최종 빌드가 진행되는 것.

언리얼 엔진은 C++을 확장해 언리얼 오브젝트라는 객체 구조를 고안하여

지정된 매크로를 사용해 빌드를 수행하면 추가 코드가 자동으로 만들어지는 구조를 가짐

언리얼 오브젝트를 사용해 성능도 챙기면서 대규모 게임 제작을 안정적으로 설계하고 구현할 수 있음.

언리얼 엔진 기술의 핵심


이득우의 언리얼 프로그래밍 Part1 | 인프런

https://www.inflearn.com/course/%EC%9D%B4%EB%93%9D%EC%9A%B0-%EC%96%B8%EB%A6%AC%EC%96%BC-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-part-1/dashboard

 

이득우의 언리얼 프로그래밍 Part1 - 언리얼 C++의 이해 강의 | 이득우 - 인프런

이득우 | 대기업 현업자들이 수강하는 언리얼 C++ 프로그래밍 전문 과정입니다. 언리얼 엔진 프로그래머라면 게임 개발전에 반드시 알아야 하는 언리얼 C++ 기초에 대해 알려드립니다., [사진] 언

www.inflearn.com