강의 목표 :
- 게임 프로그래밍이 가지는 특수성을 파악하고 언리얼 오브젝트의 필요성 이해
- 언리얼 오브젝트 선언과 엔진 내부 컴파일 과정 학습
강의 내용 :
- 게임이 대형화되며 성능과 유지보수 두 가지 모두 중요해짐
- 언리얼 엔진은 C++ 언어를 확장한 언리얼 오브젝트라는 객체 구조를 고안함
- 지정된 매크로를 사용해 빌드를 수행하면, 추가 코드가 자동으로 만들어지는 구조를 가짐
- 언리얼 오브젝트를 사용해 대규모 게임 제작을 안정적으로 설계하고 구현할 수 있음
[ ✔️게임 프로그래밍의 특수성 ]
📍사용자와 개발자의 관점차이 :
- 사용자 : 쾌적한 경험을 위해 단일 컴퓨터에서 최대 성능을 뽑아야함
- 개발자 : 게임의 규모가 커질수록 방대하고 복잡한 기능을 안정적으로 관리해야함
이러한 이유로 하드웨어에 직접 접근해서 성능을 높일 수 있는 C++언어를 채택함
C++ 이후에 만들어진 Java 와 C# 같은 언어는 성능보다 안정성을 중시하였다.
📍C++ 언어의 단점 :
1. 1970년대에 개발된 언어(C++)
- 초급자가 학습하기 어려움 (배울 순 있지만, 디테일이...)
- 하드웨어에 직접 접근하는 특성때문에 잘못 사용시 전체 프로그램에 영향을 줌
2. 1990년대 중반 이후 C++의 단점을 보완한 후발 언어의 등장(Java,C#)
- C++의 불필요한 기능을 걷어내고, 최대한 명확하고 간결하게 설계
- 성능보다 안정성, 생산성을 중요시
- 하드웨어에 직접 접근하지 않고, 가상 먼신을 통해 간접적으로 접근
- 이러한 이유로 C++에 비해서 성능이 조금 어지게 됨
[ ✔️모던 객체 지향 설계 원칙 ]
- 해당 디자인 패턴을 필두로 안정적인 설계 방법이 연구됨
- 현재 시점에서 Modern(현대)하다는 뜻은 아니다.
SOLID : 유지보수와 유연함, 확장성 향상을 위한 객체 지향 프로그래밍 원칙
이러한 것들을 편하게 구현하기 위해 Interface, Reflection, Delegate 등의 기능을 구현함
📍후발 언어(C#, Java) 등이 보완한 새로운 기능 :
- 인터페이스 : 객체 설계의 틀을 제공하는 추상 클래스
- 리플렉션 : 런타임에서 객체의 구조를 파악하고 객체에 메타데이터를 부여
- 델리게이트 : 프로그램에서 발생한 이벤트를 다수의 객체에 효과적으로 전달하는데 활용
📍언리얼 엔진의 선택 :
- 성능을 위해 기존 C++언어를 포기할 수 없음
- 기존 C++ 언어를 확장해 모던 객체 지향 설계를 가능하도록 만듬
- 모던 객체 지향 설계를 위한 새로운 시스템의 구축
"성능"과 "유지보수" 모두 얻었지만, 언리얼 C++ 까지 추가로 공부해야한다는 문제가...(공부할게 많다)
[ ✔️언리얼 오브젝트 ]
- 언리얼 엔진이 설계한 새로운 시스템의 단위 오브젝트(객체)
- 기존 C++ 오브젝트에 모던 객체 지향 설계를 위해 다양한 기능을 추가한 오브젝트
- 언리얼 오브젝트를 사용하면, 후발 언어의 장점이었던 것들을 활용할 수 있기에 생산성이 향상됨
- 일반 C++ 오브젝트와 언리얼 오브젝트의 두 객체를 모두 사용할 수 있음
- 구분을 위해 일반 C++ 오브젝트는 접두사 F, 언리얼 오브젝트는 접두사 U 사용
언리얼 엔진의 오브젝트
기본적인 게임플레이 요소인 액터와 오브젝트에 대한 설명입니다.
dev.epicgames.com
📍각 오브젝트의 사용 용도 :
- C++ 오브젝트(F) : 저수준의 빠른 처리를 위한 기능 구현
- 언리얼 오브젝트(U) : 콘텐츠 제작에 관련된 복잡한 설계 구현에 사용
📍UCLASS 매크로 :
(이후 단계에서 자세히 알아봄)
매크로 선언만으로도 Java,C# 과 같은 후발 언어들이 구현한 기능들을 사용 할 수 있다.
언리얼에는 게임 오브젝트 처리용 탄탄한 시스템이 있습니다.
언리얼에서 오브젝트의 베이스 클래스는 UObject 입니다.
UObject 에서 파생되는 클래스에 UCLASS 매크로를 사용하여 태그를 해 주면 UObject 처리 시스템에서 인식하게 됩니다.
(출처 : 언리얼_오브젝트)
UCLASS()
class UNREALSTRING_API UMyGameInstance : public UGameInstance
{
GENERATED_BODY()
public:
void Init() override;
private:
};
예제 코드를 보면, UCLASS 매크로가 클래스의 위에 선언되어 있는 것을 확인 할 수 있다.
이를통해 Unreal Editor에게 해당 클래스는 UObject이니 인식해라고 알려준다.
UGameInstance 를 파고 들어가면 UGameInstance가 UObject를 상속하고 있음을 확인할 수 있다.

결론적으로 GameInstance 클래스 자체는 언리얼 오브젝트이고, 이를 상속받는 클래스 역시 언리얼 오브젝트가 된다.
📍언리얼 헤더 툴 :
(이후 단계에서 자세히 알아봄)
= Unreal Header Tool (UHT)
언리얼 오브젝트를 처리하기위해 컴파일 과정에서 들어가는 특수한 처리 단계
[ ✔️Object 클래스 생성 (UObject) ]
📍언리얼 오브젝트의 특징 :
- 클래스 기본 객체 : 클래스의 기본 값과 타입 정보 제공
- 리플렉션 : 런타임에서 클래스 정보의 참조 기능
- 인터페이스 : 모던 객체 지향 언어가 제공하는 인터페이스 기능 제공
- 향상된 열거형 : 보다 향상된 열거형 지원
- 델리게이트 : 객체간의 결합을 낮출 수 있는 델리게이트 기능의 제공
- 가비지 컬렉션 : 자동 메모리 관리
- 향상된 구조체 : 리플렉션이 가능한 구조체의 지원
- 직렬화 : 객체 정보를 바이트 스트림으로 저장/전송/로드 기능
📍언리얼 오브젝트 분석 :
1. 언리얼 오브젝트가 되기위해 기본적으로 포함되어야 할 헤더 :
#include "CoreMinimal.h"
#include "UObject/NoExportTypes.h"
2. 프로젝트 내에 존재하지 않지만 포함됨 :
#include "MyObject.generated.h"
파일 경로 : [프로젝트 폴더]\Intermediate\Build\Win64\UnrealEditor\Inc\UnrealObject\UHT
복잡한 경로에 헤더파일이 존재하는데...
이렇게 복잡한 곳에 위치한 이유는 굳이 찾아서 건들지 말라는 의미다.
참고로 해당 파일을 삭제하더라고 컴파일 과정에서 다시 생성된다.
코드에 작성된 각종 매크로를 참조하여 UnrealObject에 관련된 "[프로젝트명].generated.h" 파일을 생성해준다.
3. GENERTATED_BODY :
4. 정리 :
- 언리얼 오브젝트의 코드를 분석하는 단계가 있기에 바로 컴파일되지 않는다. (2단계에 걸쳐 빌드 진행)
- 언리얼 헤더 툴에 의해 소스코드를 자동으로 생성하고 자동으로 생성된 코드를 포함하여 최종 빌드를 진행한다.
================================
개인 공부 기록용 포스팅입니다.
댓글, 질문 환영해요~!
Unreal Engine Ver : 5.1.1
Refer : Inflearn_이득우의 언리얼 프로그램
================================
'Unreal > Inflearn' 카테고리의 다른 글
Part1.6 언리얼 오브젝트 리플렉션 시스템 Ⅱ⭕ (0) | 2024.04.08 |
---|---|
Part1.5 언리얼 오브젝트 리플렉션 시스템 Ⅰ⭕ (0) | 2024.04.08 |
Part1.3 언리얼 C++ 기본 타입과 문자열 ⭕ (0) | 2024.04.08 |
Part1.2 언리얼 C++ 코딩 표준 ⭕ (0) | 2024.04.06 |
Unreal 초기설정⭕ (0) | 2024.02.21 |