< [이득우의 언리얼 프로그래밍 Part1 필기] 15. 언리얼 빌드 시스템

언리얼엔진5/[Part1] 이득우의 언리얼 프로그래밍

[이득우의 언리얼 프로그래밍 Part1 필기] 15. 언리얼 빌드 시스템

Rocketbabydolls 2024. 2. 28. 20:18

언리얼 에디터의 동작

  • 프로젝트 폴더의 uproject 확장자를 더블클릭하면 에디터가 트리거 됨.
  • 에디터의 실행 방식
    uproject 확장자는 윈도우 레지스트리에 등록되어 있음.
    등록이 안되어 있다면 런처를 실행해 등록

    UnrealVersionSelector 프로그램으로 프로젝트 정보가 넘겨짐
    UnrealVersionSelector 는 런처가 저장한 에디터 정보로부터 버전에 맞는 에디터를 실행함
  • UnrealVersionSelector 소스는 에픽게임즈 GitHub에서 확인 가능

 

언리얼 에디터 구성

  • 게임 제작을 위해 에픽 게임즈가 제공하는 저작 도구
  • 언리얼 엔진의 구성
    에디터 : 게임 제작을 위해 제공되는 응용 프로그램 (일반적으로 인식하는 언리얼 엔진)
    게임 빌드 : EXE 파일과 리소스로 이루어진 독립적으로 동작하는 게임 클라이언트
  • 언리얼 에디터의 특징
    게임 개발 작업을 위해 다양한 폴더와 파일 이름 규칙이 미리 설정되어 있다.
    정해진 규칙을 잘 파악하고 프로젝트 폴더와 파일을 설정해야 함
  • 에디터에서 기획과 개발을 완료한 후, 게임 빌드를 통해 최종 게임 빌드를 제작하도록 설정

 

 

 

에디터 버전 정보의 파악

  • 프로젝트.uproject 텍스트 파일에 정해져있음.
  • .uproject 확장자는 에디터를 띄우기 위한 명세서 역할을 함
  • 버젼 내용은 JSON 형식으로 구성되어 있음.
  • 파일에 기록된 버전 정보를 바탕으로 에픽 런처가 지정한 정보를 찾아 에디터를 실행함.
    ProgramData/Epic/UnrealLauncher 폴더에 관련 정보가 있음.
    이 역시 JSON 형식으로 설치된 언리얼 버전 정보가 기록되어 있음.

 

블루프린트 프로젝트

  • C++ 코드가 없는 언리얼 프로젝트를 의미함
  • 언리얼 엔진이 제공하는 기본 기능을 활용해 게임을 제작하느 프로젝트
  • 언리얼 엔진은 게임 제작에 필요한 기능을 모듈이라는 단위로 제공하고 있음
  • 언리얼 엔진의 모듈을 상속받아 블루프린트를 활용해 모든 기능과 로직을 구현하는 방식

 

그러하다.

 

언리얼 C++ 프로젝트

  • 언리얼 엔진 C++ 모듈에 개발자가 추가로 자신만의 C++ 모듈을 추가할 수 있음.
  • 언리얼 엔진 모듈과 개발자 모듈을 함께 사용하는 프로젝트

 

 

언리얼 C++ 모듈

  • 언리얼 엔진의 소스코드는 모두 모듈(Module) 단위로 구성되어 있음.
  • 모듈을 컴파일함으로서 에디터 및 게임에 우리가 제작한 로직을 공급할 수 있음.
  • 모듈 단위로 구성된 C++ 소스 코드를 컴파일한 결과물
    에디터 용으로 DLL 동적 라이브러리
    게임 용으로는 정적 라이브러리
  • 에디터 용 모듈은 언제나 UnrealEditor-{모듈이름}.DLL 이름 규칙을 가지고 있음.

 

언리얼 C++ 모듈의 추가

  • 기본 언리얼 모듈에 우리가 제작한 C++ 모듈을 추가해 에디터를 띄우고 싶은 경우.
  • 우리가 만든 에디터 모듈(DLL 동적라이브러리)을 빌드 폴더에 넣어주어야 함.
    Windows의 경우 Binaries/Win64 폴더에 해당 DLL 을 넣어야 함
    빌드된 모듈 목록이 있는 UnrealEditor.modules 파일도 같은 폴더에 넣어주어야 인식됨.
  • uproject 명세서에 모듈 이름을 지정하고 에디터를 실행 (build.cs)

 

모듈 C++ 코드의 관리

  • 언리얼 프로젝트가 소스 코드를 관리하는 규칙에 따라 소스 코드 구조를 구성해야 함.
  • 소스 코드는 멀티 플랫폼 빌드 시스템을 지원하기 위해 특정 프로그램에 종속되어 있지 않음.
  • 실제 빌드를 진행하는 주체 : Unreal Build Tool 이라는 C# 프로그램
  • Source 폴더에 지정된 규칙대로 소스를 넣으면 플랫폼에 맞춰서 알아서 컴파일을 진행

 

 

 

Source 폴더의 구조

  • Source 폴더
    타겟 설정 파일
    모듈 폴더 (보통은 프로젝트 이름으로 모듈 이름을 지정)
           모듈 설정 파일
           소스 코드 파일 (.h 및 .cpp 파일들)
  • 타겟 설정 파일 : 전체 솔루션이 다룰 빌드 대상을 지정함.
    {프로젝트이름}.Target.cs : 게임 빌드 설정
    {프로젝트이름}Editor.Target.cs : 에디터 빌드 설정
  • 모듈 설정 파일 : 모듈을 빌드하기 위한 C++ 프로젝트 설정 정보
    {모듈이름}.Build.cs : 모듈을 빌드하기 위한 환경 설정

C# 이 가진 유연한 기능(Compile on-the-fly)을 활용해 런타임에 cs 파일을 읽어 빌드 환경을 구축하고 컴파일을 진행함

 

 

모듈간의 종속 관계

  • 모듈 사이에 종속 관계를 설정해 다양한 기능을 구현할 수 있다.
  • 우리가 만드는 게임 모듈도 언리얼 엔진이 만든 모듈을 활용해야 한다.
  • 언리얼 엔진이 제공하는 모듈 상에도 종속 관계가 있음.

 

 

 

새로운 모듈의 추가

  • 하나의 모듈에 너무 많은 코드가 들어가면 언리얼 엔진은 빌드 방식을 변경함.
  • 그렇기에 프로젝트가 커질 수록 모듈을 나누어서 관리하는 것이 유리.

 

 

모듈의 공개와 참조

  • 모듈 내 소스를 필요한 만큼만 공개해야 모듈 간 의존성을 줄이고 컴파일 타임을 최소화 할 수 있음.
  • 공개할 파일은 모두 Public 폴더로
    예외) 예전 언리얼 엔진은 Classes 폴더가 있어 Public 폴더 역할을 하면서 언리얼 오브젝트를 관리했음
  • 숨길 파일은 모두 Private 폴더로
  • 외부로 공개할 클래스 선언에는 {모듈이름}_DLL 매크로를 붙인 것.
  • 게임 모듈에서는 Build.cs 설정을 통해 참조할 모듈을 지정할 수 있음.

 

 

 

플러그인 시스템

  • 게임 프로젝트 소스에 모듈을 추가하는 방법은 분업이 어렵다는 단점이 있음.
  • 모듈만 독립적으로 동작하는 플러글인 구조를 만들어 분업화하는 것이 바람직함.

 

 

 

플러그인 구조

  • 플러그인은 다수의 모듈과 게임 콘텐츠를 포함하는 포장 단위
  • 에디터 설정을 통해 유연하게 플러그이능ㄹ 추가하거나 삭제할 수 있음
    • 플러그인 구조
      플러그인 명세서 (uplugin 파일)
      플러그인 리소스 (Resource 폴더, 에디터 메뉴용 아이콘)
      콘텐츠
      모듈 폴더
  • 이러한 플러그인은 마켓 플레이스 판매로도 이어질 수 있도록 여러 설정을 추가할 수 있음.

 

게임 빌드

  • 게임 타켓 설정을 추가하면 게임 빌드 옵션이 추가됨.
  • 게임 타겟으로 빌드된 모듈은 정적 라이브러리로 실행 파일에 포함됨.
  • 게임이 실행되기 위해서는 실행 파일과 콘텐츠 에셋이 함께 있어야 함 
    • 빌드 : 실행 파일을 생성하기 위한 컴파일
    • 쿠킹 : 지정한 플랫폼에 맞춰 콘텐츠 에셋을 변환하는 작업
    • 패키징 : 이들을 모두 모아서 하나의 프로그램으로 만드는 작업

 

 

 

주 게임 모듈과 이를 보조하는 서브 모듈이 있을 떄 주 게임 모듈은 서브 모듈이 제공하는 기능에 의존하게 된다.
필요한 만큼만 참조하도록 설계하는 것이 좋음. 

 

build.cs 파일이 있는 곳이 모듈이 시작되는 곳이다.

 

 

UPersonImpl 삭제 !!

 

 

pirvate 클래스들은 api 매크로 삭제해서 외부로 노출시키지 않는다.

 

 

shipping

-> 사용자에게 배포할 최종 게임의 코드를 만듦
이 과정에서 check, ensure 어셜션 매크로들은 제외됌