[UE5] 이득우 Part 1. 15강 언리얼 빌드 시스템

공부 스파이럴·2023년 12월 28일
0

언리얼 에디터 구성

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

언리얼 에디터 동작

  • 프로젝트 폴더의 uproject 확장자를 더블클릭하면 에디터가 트리거 됨
  • 에디터 실행 방식
    • uproject 확장자는 윈도우 레지스트리에 등록되어 있음
      • 안되어 있으면 런처를 통해 등록
    • UnrealVersionSelector 프로그램으로 정보 넘김
    • UnrealVersionSelector는 런처가 저장한 에디터 정보로부터 버전에 맞는 에디터 실행

에디터 버전 정보 파악

  • 프로젝트.uproject 텍스트 파일에 버전 정보가 있음
  • 에픽게임즈 런처는 프로그램 데이터 폴더에 LauncherInstalled.dat 파일에 몇 버전이 어디서 설치되어 있는지 정보가 저장
  • 프로젝트 폴더 생성 및 txt파일 생성
    • 내용은 JSON 형식으로 아래와 같이 작성
    • 확장자를 uproject로 변경
{
	"FileVersion" : 3,
    "EngineAssociation" : "5.1"
}
  • 실행하면 자동으로 폴더 생성
    • Config : 프로젝트 설정에 필요한 정보를 보관
    • Content : 에셋을 보관
    • DerivedDataCache : 우리가 사용하는 에셋들의 주요 정보들을 미리 캐싱
      • 로딩을 빨리하는데 도움
      • 용량이 급해 지워도 동작에는 문제 없음
    • Intermediate : 임시적으로 사용되는 중간 결과물들을 보관
      • 용량이 크면 언제든지 삭제해도 무방
    • Saved : 임시로 무언가를 저장
      • 의도적으로 어떤 데이터를 저장하지 않았으면 지워도 문제 없음

블루프린트 프로젝트

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

  • 언리얼 엔진 C++ 모듈에 개발자가 추가로 자신만의 C++ 모듈을 추가할 수 있음

언리얼 C++ 모듈

  • 언리얼 엔진의 소스코드는 모두 모듈 단위로 구성
  • 모듈을 컴파일해 에디터 및 게임에 우리가 제작한 로직 공급 가능
  • 모듈 단위로 구성된 C++ 소스 코드를 컴파일한 결과물
    • 에디터 용으로 DLL 동적라이브러리
    • 게임 용으로 정적 라이브러리
  • 에디터 용 모듈은 항상 UnrealEditor-{모듈이름}.DLL 이름 규칙

언리얼 C++ 모듈 추가

  • 직접 제작한 C++ 모듈을 에디터에 추가 가능
  • 에디터 모듈을 빌드 폴더에 넣어줘야 함
    • Windows의 경우 Binaries/Win64 폴더에 해당 DLL을 넣어야 함
    • 빌드된 모듈 목록이 잇는 UnrealEditor.modules 파일도 같은 폴더에 넣어줘야 인식됨
  • uproject 명세서에 모듈 이름을 지정하고 에디터를 실행
{
	"FileVersion" : 3,
    "EngineAssociation" : "5.1"
    "Modules" : [
    	{
        	"Name" : "모듈이름"
            "Type" : "Runtime"
        }
    ]
}

모듈 C++ 코드 관리

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

Source 폴더 구조

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

  • C#은 실행 중에 코드를 바로 컴파일하고 결과를 반영할 수 있는 기능이 있음(complie on-the-fly)
    • 이 기능을 이용하기 위해 C# 파일로 설정을 지정

게임 프로젝트의 소스

  • 모듈을 구현한 헤더와 소스 파일이 있어야 함
    • 주로 {모듈이름}.h와 {모듈이름}.cpp로 지정
  • 모듈의 뼈대를 제작해주는 매크로 지정
    • IMPLEMENT_MODULE : 일반 모듈
      • 게임과는 직접 연관은 없지만 유용한 기능을 제공
    • IMPLEMENT_GAME_MODULE : 게임 모듈
      • 게임 제작 관련 모듈
    • IMPLEMENT_PRIMARY_GAME_MODULE : 주 게임 모듈
      • 게임 제작에 가장 중심이 되는 전체적인 게임 동작하는데 사용하는 로직을 모아둔 모듈
  • 일반적으로 게임 프로젝트는 주 게임 모듈을 하나 선언해야 함

  • 세팅을 갖춘 후 uproject 파일을 우클릭해서 Generate Visual Studio project files. 메뉴를 선택
    • Unreal Version Selector 프로그램이 알아서 언리얼 빌드 툴을 가동해서 Intermediate 폴더에 관련된 프로젝트 파일을 자동으로 생성해 줌
  • Source 폴더를 규칙에 맞게 구성하면 Intermediate 폴더는 언제든지 재생성 가능

모듈 간의 종속 관계

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

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

모듈의 공개와 참조

  • 모듈 내 소스를 필요한 만큼만 공개해야 모듈 간 의존성을 줄이고 컴파일 타임을 최소화 할 수 있음
  • 공개할 파일은 모두 Public 폴더로
  • 비공개 파일은 모두 Private 폴더로
  • 외부로 공개할 클래스 선언에는 {모듈이름}_DLL 매크로
  • 서브 모듈 설정을 완료하면 주게임 모듈의 Bulid.cs 설정에서 서브 모듈의 이름을 넣어주면 됨

플러그인 시스템

  • 게임 프로젝트 소스에 모듈 추가하는 방법은 분업이 어려움
  • 모듈만 독립적으로 동작하는 플러그인 구조를 만들어 분업화

플러그인 구조

  • 플러그인 : 다수의 모듈과 게임 콘텐츠를 포함하는 포장 단위
  • 에디터 설정을 통해 유연하게 플러그인 추가 삭제 가능
  • 플러그인 구조
    • 플러그인 명세서 (uplugin 파일)
    • 플러그인 리소스 (Resource 폴더, 에디터 메뉴용 아이콘)
    • 콘텐츠
    • 모듈 폴더

  • Plugins 폴더를 만들어줘야 함
  • 에디터 메뉴를 통해서도 uplugin 파일 추가 가능
    • 내부 구조는 아래와 같은 방식
{
	"FileVersion": 3,
    "Version": 1,
    "VersionName": "1.0",
    "FriendlyName": "GameUtility",
    "Modules": [
    	{
        	"Name": "CommonUtility",
            "Type": "Runtime",
            "LoadingPhase": "Default"
        }
    ]
}

게임 빌드

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

  • 타겟 설정 추가
  • Shipping 빌드가 배포할 최종 게임의 코드를 만드는 작업

0개의 댓글