본문 바로가기
Unreal/[서적] 언리얼5 이득우님 인프런1

Ch 04. 언리얼 오브젝트

by GameStudy 2023. 5. 9.

4.1 언리얼 오브젝트 소개

4.1-1 게임 프로그래밍의 특수성

  - 사용자 관점: 단일 컴퓨터에서 최대 성능이 뽑아져야 쾌적한 경험 가능.

  - 개발자 관점: 게임의 규모가 커질수록 방대하고 복잡한 기능을 안정적으로 관리해야 함.

C++ 언어
(안정성보다 성능 중시. 사용자 관점)
타 OOP 언어
(성능보다 안정성중시. 개발자 관점)
Cache의 활용 극대화 / 복사 작업의 최소 유지보수성 향상
저수준 API의 직접 호출 크래시로부터 보호
메모리 직접 제어 자동 메모리 관리
  고질적 실수 예방

 

4.1-2 C++ 언어의 단점

  - 하드웨어에 직접 접근 가능하기 때문에 잘못 사용하면 프로그램에 큰 영향을 미침.

    이때문에 초급자가 학습하기 어려운 내용들이 많음.

  - C++ 이후에 개발된 Java, C#의 경우에는 성능보다는 안정성과 생산성을 중시함.

    이 언어들은 간단하며, 실수들을 예방해줌.

 

4.1-3 현대 개체 지향 프로그래밍

  - 현대의 OOP 언어에서는 안정적인 설계 방법이 많이 연구됨.

    대표적인 것이 디자인 패턴.

    유지보수/유연함/확장성을 위한 대표적인 OOP 프로그래밍 원칙이 SOLID

  - 또한 C++을 보완한 새 기능을 탑재함.

    인터페이스 / 리플렉션 / 델리게이트

  - 게임 규모가 대형화 되면서 현대 개체 지향 설계 도입이 C++에도 필요해짐.

 

4.1-4 언리얼 엔진 C++ 특징

  - 성능을 위해서 기존 C++ 언어를 포기하지 않음.

    그래서 C++의 매크로를 이용해서 현대 개체 지향 설계도 가능하게끔 개선함.

    즉, 성능과 안정성/생산성을 모두 잡음.

 

4.2 언리얼 오브젝트

4.2-1 언리얼 오브젝트의 소개

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

    기존 C++ 오브젝트에 현대 개체 지향 프로그래밍을 위한 다양한 기능이 추가된 오브젝트.

    언리얼에서는 C++ 오브젝트와 언리얼 오브젝트 모두 사용할 수 있음.

    구분을 위해서 접두사 활용(C++ 클래스 오브젝트는 F, 언리얼 오브젝트는 U)

  - 각 오브젝트의 사용 용도

    C++ 오브젝트: 저수준의 빠른 처리를 위한 기능 구현에 사용.

    언리얼 오브젝트: 컨텐츠 제작에 관련된 복잡한 설계 구현에 사용.

 

4.2-2 언리얼 헤더 툴

  - 컴파일 과정에서 언리얼 오브젝트를 처리하기 위한 툴.

    언리얼 오브젝트의 장점들을 제공하기 위한 전처리 작업을 진행함.

 

4.2-2 언리얼 오브젝트의 특징 

  - 클래스 기본 개체(CDO): 클래스의 기본 값과 타입 정보를 제공

  - 리플렉션(Reflection): 클래스 정보를 런타임 중에도 제공하는 기능

  - 인터페이스(Interface): 현대 개체 지향 언어가 제공하는 인터페이스와 동일.

  - 델리게이트(Deligate): 개체 간의 결합도를 낮출 수 있는 기능

  - 가비지컬렉션(Garbage Collection): 자동 메모리 관리

  - 직렬화(Serialization): 개체 정보를 바이트 스트림으로 읽기/쓰기/전송 해주는 기능.

 

4.2-3 언리얼 오브젝트 실습 예제

  - UnrealObject 프로젝트 생성

  - 새 C++ 클래스 > Object 부모 클래스 > "MyObject" 클래스 생성

  - [여기에 언리얼 오브젝트 클래스 생성 방법 내용 작성]

  - GENERATED_BODY() 매크로를 Ctrl + 클릭하면 수많은 매크로 코드를 볼 수 있음.

    이를 통해서 generated.h 파일을 만들어 내서 현대 개체 지향 프로그래밍 기능들을 구현하는 것.

  - 프로젝트 폴더 > Intermediate > Build > Win64 > UnrealEditor > Inc > UnrealObject > UHT 폴더

    여기에 generated.h 파일이 저장됨. 파일을 열어보면 자동 생성된 내용들을 볼 수 있음.

    최하단의 내용을 보면, GENERATED_BODY() 매크로 내에서 본 내용들이 보임.

  - 굳이 이런 내용들을 이해할 필욘 없음. 그냥 이런게 있다 정도.

    또한 generated.h 파일을 변경할 필요도 없음.

    소스 파일들이 수정되면 generated.h 파일도 자동변경되기 때문.

    심지어 generated.h 파일을 삭제하더라도 다시 빌드하면 컴파일 과정에서 재생성됨.

    컴파일 과정에서는 Unreal Header Tool이 동작하면서 헤더 파일들을 파싱하기 시작.

    UHT는 헤더 파일에 작성된 매크로들을 참고해서 generated.h 파일을 자동 생성해줌.

<hide/>

// MyObject.h

#pragma once

#include "CoreMinimal.h"
#include "UObject/NoExportTypes.h"
#include "MyObject.generated.h"


/**
 * 
 */
UCLASS()
class UNREALOBJECT_API UMyObject : public UObject
{
	GENERATED_BODY()
	
};
<hide/>

// MyObject.cpp

#include "MyObject.h"

댓글