언리얼 오브젝트의 소개와 선언방법

  • 게임 프로그래밍이 가지는 특수성과 언리얼 오브젝트의 필요성의 이해
  • 언리얼 오브젝트의 선언과 엔진 내부 컴파일 과정의 학습

 

 

인프런 이득우님의 '언리얼 프로그래밍 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/

     

    오브젝트

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

    docs.unrealengine.com


     

     

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

     

    • 클래스 기본 객체 (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” 보다 먼저 생성 및 업데이트 되어야 한다
      1. 컴파일 시작
      2. Unreal Header Tool (UHT)을 통해 .generated.h 생성
      3. #include 구문 올바른 컴파일 가능
      4. 컴파일 진행
      5. 최종 빌드

     

    메타 데이터

    • .generated.h를 비롯한 언리얼 헤더 툴이 컴파일을 위해 만드는 소스
    • Intermediate/Build/Wind64/UnrealEditor/Inc/UnrealObject/UHT

     

     

    Unreal Header Tool(UHT)가 실행되면 헤더들을 관찰하고 클래스 내의 매크로들을  참조하여 자기가 언리얼 오브젝트에 관련된 generated.h 파일을 UHT 프로그램이 자동으로 생성시킨다.

     

    Unreal Header Tool(UHT)에 의해 소스 코드를 자동으로 생성하고 자동으로 생성된 코드를 포함해서 마지막 최종 Build를 진행한다.

     

     

     

    ObjectMacro.h