[UE] 언리얼 오브젝트 시스템
언리얼 오브젝트의 소개와 선언방법
- 게임 프로그래밍이 가지는 특수성과 언리얼 오브젝트의 필요성의 이해
- 언리얼 오브젝트의 선언과 엔진 내부 컴파일 과정의 학습
인프런 이득우님의 '언리얼 프로그래밍 Part1 - 언리얼 C++의 이해' 강의를 참고하였습니다.
😎 [이득우의 언리얼 프로그래밍 Part1 - 언리얼 C++의 이해] 강의 들으러 가기!
목차
C++ 언어
게임 프로그래밍의 특수성
- 사용자: 쾌적한 경험을 위해 단일 컴퓨터에서 최대 성능을 뽑아내야 한다.
- 개발자: 게임의 규모가 커질수록 방대하고 복잡한 기능을 안정적으로 관리해야 한다.
C++ 언어의 단점
C++
- 1970년대 개발하여 오래됨
- 객체 지향 프로그래밍의 선두 주자
- 현재까지 지속적으로 개선해왔지만, 익혀야 할 내용이 많음
- 하드웨어에 직접 접근하기 때문에, 잘못 사용하면 프로그램에 큰 영향을 미침
후발 언어들의 탄생
- 1990년 중반 이후 JAVA / C# 탄생
- C++의 불필요한 기능을 걷어내고, 최대한 명확하고, 간결하게 설계
- 성능보다 안정성과 생산성을 중요시 함
- 하드웨어에 직접 접근하지 않고, 가상 머신을 통해 간접적으로 접근
모던 객체 지향 설계 원칙
SOLID
Single Responsibility Principle | 하나의 클래스는 하나의 책임만 가져야 한다. |
Open / Close Principle | 클래스 설계를 변경하지 않고 동작을 확장할 수 있어야 한다. |
Liskov Substitution Principle | 자식 클래스는 부모 클래스를 대체할 수 있어야 한다. |
Interface Segreation Principle | 작고 명확한 인터페이스들로 분리해 관리해야 한다. |
Dependency Inversion Principle | 구현을 배제시킨 상위 정책을 바라보며 설계해야 한다. |
후발 언어(Java / C#)들이 가지는 새로운 기능
Interface 인터페이스 | 객체 설계의 틀을 제공해주는 추상 클래스 |
Reflection 리플렉션 | 런타임에서 객체의 구조를 파악하고 객체에 메타데이터를 부여 |
Delegate 델리게이트 | 프로그램에서 발생한 이벤트를 다수의 객체에 효과적으로 전달하는데 활용 |
언리얼 C++과 오브젝트
언리얼 C++
- 언리얼 엔진에서는, 성능을 위해 C++ 사용
- 모던 객체 지향을 구현하기 위해 매크로 활용
- 기존 C++의 특징과 하이 레벨 언어의 특징의 조화
언리얼 오브젝트
- 기존 C++ 오브젝트에 모던 객체 지향 설계를 위해, 언리얼만의 새로운 시스템 단위 오브젝트
- 기존 C++ 오브젝트와 언리얼 오브젝트의 두 객체를 모두 사용할 수 있음
- 기존 C++ 오브젝트 : 접두사 F, 저수준의 빠른 처리를 위한 기능 구현에 사용
- 언리얼 C++ 오브젝트 : 접두사 U, 콘텐츠 제작에 관련된 복잡한 설계 구현에 사용
오브젝트 생성
https://docs.unrealengine.com/5.0/ko/objects-in-unreal-engine/
언리얼 오브젝트가 가지는 특징
- 클래스 기본 객체 (CDO): 클래스의 기본 값과 타입 정보 제공
- 리플렉션 (Reflection): 런타임에서 클래스 정보의 참조 기능
- 인터페이스: 모던 객체 지향 언어가 제공하는 인터페이스의 제공
- 향상된 열거형: 보다 향상된 열거형의 지원
- 델리게이트: 객체간의 결합을 낮출 수 있는 델리게이트 제공
- 가비지 컬렉션: 자동 메모리 관리
- 향상된 구조체: 리플렉션이 가능한 구조체의 지원
- 직렬화: 객체 정보를 바이트 스트림으로 저장, 전송, 불러들이는 기능
클래스 기본 객체 (CDO) | 클래스의 기본 값과 타입 정보 제공 |
리플렉션 (Reflection): | 런타임에서 클래스 정보의 참조 기능 |
인터페이스 (Interface) | 모던 객체 지향 언어가 제공하는 인터페이스의 제공 |
향상된 열거형 | 보다 향상된 열거형의 지원 |
델리게이트 (Delegate) | 객체간의 결합을 낮출 수 있는 델리게이트 제공 |
가비지 컬렉션 (Garbage Collection) | 자동 메모리 관리 |
향상된 구조체 (Struct) | 리플렉션이 가능한 구조체의 지원 |
직렬화 (Serialization) | 객체 정보를 바이트 스트림으로 저장, 전송, 불러들이는 기능 |
언리얼 C++과 오브젝트
코드 분석
#pragma once
#include "CoreMinimal.h"
#include "Object.h"
#include "MyObject.generated.h"
UCLASS()
class MYPROJECT_API UMyObject : public UObject
{
GENERATED_BODY()
};
UCLASS ()
- 언리얼 오브젝트 리플렉션을 구현하기 위한 매크로 중 하나
[프로젝트 이름]_API
- 다른 언리얼 Module(언리얼 DLL / API)에서도 접근할 수 있도록 개방해 주는 키워드
- 이 키워드를 없애면 MyObject는 다른 Module에서 참조를 하지 않고 같은 Module 내에서만 사용할 수 있다.
[ClassName].generated.h
- 모던 객체 지향 스타일(C#, Java)의 언리얼 C++를 구현하기 위한 소스
- 빌드할 때, 새롭게 생성 및 갱신
- 헤더 파일들은 #include “[ClassName].generated.h” 보다 먼저 생성 및 업데이트 되어야 한다
- 컴파일 시작
- Unreal Header Tool (UHT)을 통해 .generated.h 생성
- #include 구문 올바른 컴파일 가능
- 컴파일 진행
- 최종 빌드
메타 데이터
- .generated.h를 비롯한 언리얼 헤더 툴이 컴파일을 위해 만드는 소스
- Intermediate/Build/Wind64/UnrealEditor/Inc/UnrealObject/UHT
Unreal Header Tool(UHT)가 실행되면 헤더들을 관찰하고 클래스 내의 매크로들을 참조하여 자기가 언리얼 오브젝트에 관련된 generated.h 파일을 UHT 프로그램이 자동으로 생성시킨다.
Unreal Header Tool(UHT)에 의해 소스 코드를 자동으로 생성하고 자동으로 생성된 코드를 포함해서 마지막 최종 Build를 진행한다.
ObjectMacro.h
'⭐ Unreal Engine > UE 개념정리 - 언리얼의 이해' 카테고리의 다른 글
[UE] 언리얼 리플렉션 Unreal Reflection II (0) | 2024.03.21 |
---|---|
[UE] 언리얼 리플렉션 Unreal Reflection I (0) | 2024.03.18 |
[UE] 문자타입, 문자열 FString, FText, FString (0) | 2024.03.13 |
[UE] 언리얼 C++ 코딩 표준 (0) | 2024.03.06 |
[UE] Hello Unreal (0) | 2024.03.06 |
댓글
이 글 공유하기
다른 글
-
[UE] 언리얼 리플렉션 Unreal Reflection II
[UE] 언리얼 리플렉션 Unreal Reflection II
2024.03.21 -
[UE] 언리얼 리플렉션 Unreal Reflection I
[UE] 언리얼 리플렉션 Unreal Reflection I
2024.03.18 -
[UE] 문자타입, 문자열 FString, FText, FString
[UE] 문자타입, 문자열 FString, FText, FString
2024.03.13 -
[UE] 언리얼 C++ 코딩 표준
[UE] 언리얼 C++ 코딩 표준
2024.03.06