일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- Security
- 언리얼엔진
- frequency-domain spectrum analysis
- dtft
- 게임 개발
- MAC
- ret2libc
- 게임개발
- 유스케이스
- MLFQ
- Rr
- AINCAA
- linear difference equation
- dirty cow
- STCF
- pdlc
- sampling theory
- 메카님
- 유니티
- Unity #Indie Game
- stride
- RBAC
- DP
- CTF
- 운영체제
- TSet
- Double free
- DSP
- 배경 그림
- Race condition
- Today
- Total
다양한 기록
[UE] Unreal Build System 본문
언리얼 에디터 (엔진) -> 게임 제작을 위해 에픽 게임즈가 제공하는 저작 도구
언리얼 엔진의 구성
- 에디터 : 게임 제작을 위해 제공되는 응용 프로그램 (일반적으로 엔진이라 부르는 것)
- 게임 빌드 : EXE 파일과 리소스로 이루어진 독립적으로 동작하는 게임 클라이언트
에디터에서 기획 및 개발 => 이후 게임 빌드
언리얼 에디터의 동작
프로젝트 폴더의 uproject 확장자 더블 클릭 시 에디터 트리거
실행 방식
- uproject 확장자는 윈도우 레지스트리에 등록됨 (등록이 안되어 있을 시 런처를 실행해 등록)
- UnrealVersionSelector 프로그램으로 프로젝트 정보가 넘겨짐
- UnrealVersionSelector는 런처가 저장한 에디터 정보로부터 버전에 맞는 에디터 실행
에디터 버전 정보의 파악
프로젝트.uproject 텍스트 파일에 정해져 있음
.uproject 확장자는 에디터를 띄우기 위한 명세서 역할
버전 내용은 JSON 형식
파일에 기록된 버전 정보를 바탕으로 에픽 런처가 지정한 정보를 찾아 에디터가 실행
- ProgramData/Epic/UnrealLauncher 폴더에 관련 정보가 있음
위와 같이 JSON 형식으로 텍스트 파일 만들고 확장자 .uproject로 변경 후 실행
-> 필요한 폴더 알아서 생기면서 에디터 켜짐
Intermediate는 중간 결과물 (삭제 가능)
Saved는 임시 저장소 (삭제 가능)
Content는 애셋 저장
DerivedDataCache는 로딩을 빨리 하기 위한 캐싱용 (삭제 가능)
Config는 프로젝트 설정 정보 보관
블루프린트 프로젝트
- C++ 코드가 없는 언리얼 프로젝트를 의미
- 언리얼 엔진이 제공하는 기본 기능을 활용해 게임을 제작하는 프로젝트
- 언리얼 엔진은 게임 제작에 필요한 기능을 (C++)모듈이라는 단위로 제공
- 언리얼 엔진의 모듈을 상속받아 블루프린트를 활용해 모든 기능과 로직을 구현하는 방식
프로젝트를 진행하다 보면, 필요한 모듈을 직접 설계해서 C++ 코드로 제공할 필요가 있음 (개발자 C++ 모듈)
언리얼 C++ 모듈
- 언리얼 엔진의 소스코드는 모두 모듈 단위로 구성됨
- 모듈을 컴파일하여 에디터 및 게임에 우리가 제작한 로직 공급 가능
- 모듈 단위로 구성된 C++ 소스 코드를 컴파일한 결과물
- 에디터 용: DLL 동적 라이브러리
- 게임 용: 정적 라이브러리
- 에디터용 모듈은 언제나 UnrealEditor-{모듈이름}.DLL 의 이름 규칙을 가짐
언리얼 C++ 모듈의 추가
- 직접 만든 에디터 모듈(DLL 동적 라이브러리)을 빌드 폴더에 넣어줘야 함
- 윈도우의 경우 Binaries/Win64 폴더에 해당 DLL 을 넣어야 함
- 빌드된 모듈 목록이 있는 UnrealEditor.modules 파일도 같은 폴더에 넣어주어야 인식
- uproject 명세서에 모듈 이름을 지정하고 에디터를 실행
다른 프로젝트의 Binaries를 그대로 복붙
* 내부에 UnrealEditor.modules 파일 이미 있음
uproject 파일 수정 후 실행(더블클릭)
잘 됨
모듈 C++ 코드의 관리
언리얼 프로젝트가 소스 코드를 관리하는 규칙에 따라 소스 코드 구조를 구성해야 함
소스 코드는 플랫폼 독립적
실제 빌드를 진행하는 주체: Unreal Build Tool (각 운영체제에 맞게 컴파일함, C# 프로그램)
Source 폴더에 지정된 규칙대로 소스를 넣으면 플랫폼에 맞춰 알아서 컴파일됨
Source 폴더 구조
Source 폴더
- 타겟 설정 파일
- 모듈 폴더 (보통 프로젝트 이름으로 모듈 이름을 지정)
- 모듈 설정 파일
- 소스 코드 파일 (.h 및 .cpp 파일)
타겟 설정 파일 : 전체 솔루션이 다룰 빌드 대상 지정
- {프로젝트이름}.Target.cs : 게임 빌드 설정
- {프로젝트이름}.Editor.Target.cs : 에디터 빌드 설정
- 프로그램이나 서버같은 다른 설정 파일도 존
모듈 설정 파일 : 모듈을 빌드하기 위한 C++ 프로젝트 설정 정보
- {모듈이름}.Build.cs : 모듈을 빌드하기 위한 환경 설정
- 모듈을 빌드하기 위해 참조할 다른 모듈에 대한 정보를 지정
이런 설정 파일들은 C# 코드로 구성됨
UnrealBuildTool이 C#이기 때문
C#은 실행 중에 코드를 바로 컴파일하고 그 결과를 바로 반영 가능 (compile on-the-fly)
** 이래서 유니티는 에디터 켜진 상태로 코드 변경이 바로바로 되는 거
게임 프로젝트의 소스
- 내가 만든 소스가 게임 프로젝트의 C++ 모듈이 되기 위해 필요한 것
- 모듈은 선언한 헤더와 구현한 소스 파일이 있어야 함
- {모듈이름}.h , {모듈이름}.cpp
- 모듈의 뼈대를 제작
- 매크로를 이용
- IMPLEMENT_MODULE : 일반 모듈
- IMPLEMENT_GAME_MODULE : 게임 모듈
- IMPLEMENT_PRIMARY_GAME_MODULE : 주 게임 모듈
- 일반적으로 게임 프로젝트는 주 게임 모듈을 하나 선언해야 함
모든 준비 완료 시 Generate Visual Studio project files. 메뉴 선택
intermediate 폴더에 프로젝트 관련 파일이 자동 생성
Source 폴더를 규칙에 맞게 구성 시 Intermediate 폴더는 언제든지 재생성 가능
일단 앞에서 추가한 Binaries는 삭제
uproject 파일 변경
Source 폴더 생성
Source 폴더 내부에 모듈 폴더와 타겟 설정 파일 생성
Target.cs 파일은 프로젝트 단위로 관리되어 프로젝트에 단 하나만 존재
모듈 파일 + 모듈이름으로 된 헤더파일과 cpp 파일
기본적인 모듈: Core, CoreUObject, Engine, InputCore
추가 옵션 선택해서 제네레이트 하면
언리얼 빌드 툴에 의해 소스코드 내 구조 분석하고 관련된 비쥬얼 스튜디오 프로젝트를
Intermediate 폴더에 생성해줌
생성 후 기타 등등 파일들 생성됨
그리고 총괄하는 솔루션 파일은 루트에 생김
문제는 경로 인식을 못하고, 컴파일도 안됨
빌드 세팅 버전 바꾸고(이전 프로젝트 꺼 참고)
Intermediate랑 총괄 솔루션 파일 제거 후 다시 제네레이트 하니 이제야 인식함
그리고 모듈의 뼈대를 구축할 클래스 필요한데,
주 게임 모듈로 위 매크로로 사용 가능
기본 클래스는 언리얼 엔진에서 제공함
클래스 하나 추가하면 모듈까지 같이 보임
추가하기 전에는 모듈에 아무것도 없어서 안보임
모듈 간의 종속 관계
언리얼 엔진이 제공하는 모듈 사이에도 종속 관계
최하단에 Core
바로 위에 CoreUObejct
부가적으로 Json, JsonUtilities 존재
이러한 기능들이 모여서 Engine 이라는 거대한 모듈
하나의 모듈에 너무 많은 코드가 들어가면 언리얼 엔진은 해당 모듈의 컴파일 방식을 자동 변경
모듈은 나누어서 관리하는 것이 좋음
모듈의 공개와 참조
- 모듈내 소스를 필요한 만큼만 공개해야 모듈 간 의존성을 줄이고 컴파일 타임 최소화 가능
- 공개할 파일은 모두 Public 폴더로
- 숨길 파일은 모두 Private 폴더로
- 외부로 공개할 클래스 선언에는 {모듈이름}_DLL 매크로 붙이기
- 게임 모듈에서는 Build.cs 설정을 통해 참조할 모듈 지정 가능
=> 서브 모듈의 딱 필요한 부분만 참조하도록 설계하라는 것
엔진 소스 코드 보면 굉장히 모듈이 많음
런타임에도 뭐가 엄청 많은데
그 안에 Core 모듈 있음
Core.Build.cs도 확인 가능, 그리고 퍼블릭, 프라이빗 폴더도 확인 가능
모듈은 .Build.cs가 있는 곳이 시작이다 라고 보면 됨
퍼블릭 폴더에는 외부로 노출되는 헤더 파일들 확인 가능
엔진도 있는데 Classes라는 폴더 존재
Public과 동일한데, 이전 버전에서는 Classes에서 관리하도록 했음
지금은 그냥 Public에 하면 됨
플러그인 시스템
- 플러그인은 다수의 모듈과 게임 콘텐츠를 포함하는 포장 단위
- 에디터 설정을 통해 유연하게 플러그인을 추가하거나 삭제할 수 있음
- 플러그인 구조
- 플러그인 명세서 (uplugin 파일)
- 플러그인 리소스 (Resource 폴더, 에디터 메뉴용 아이콘)
- 콘텐츠
- 모듈 폴더
이름을 Plugins로 해줘야 Unreal Build Tool이 감지함
플러그인 이름대로 폴더 만들고
소스 폴더랑 .uplugin 파일 만들기
안에 모듈은 CommonUtility 로 설정
소스 폴더 들어가서 모듈 폴더 만들어주고
세개 만들어주면 됨
.Build.cs 파일
이후 제네레이트 파일 -> 다른 파일들까지 알아서 만들어짐
.h랑 .cpp 파일에서 작업해주는데,
일반 모듈이니 IMPLEMENT_MODULE 사용
이후 오브젝트 생성 시 모듈 결정 가능
플러그인 안에 만들어짐
이러면 파일들이 이렇게 생기는데
Person을 제외하고는 전부 숨길 거임
모듈에 대한 헤더와 Person에 대한 헤더만 퍼블릭으로 옮겨줘야 함
CommonUtility 모듈을 참고하는 사람들은 Person만 참조 가능
구조 변경했으니 솔루션 재생성 필요(제네레이트)
여기서 PersonImpl은 외부에 안보여줄 거임
매크로 제거 필요
이제 주 게임 모듈의 .Build.cs 참조에 추가해주면 됨
* 주 게임 모듈은 최종 종착지임, 다른 모듈이 주 게임 모듈을 참조하면 꼬이기 시작
* 그래서 주 게임 모듈은 퍼블릭 프라이빗 나눌 필요는 없음
Student.h 에서 포함시켜주고 (에러 표시는 뜨는데 빌드 됨)
상속
그런데 실행 후 플러그인이 컨텐츠 브라우저에 안보임
컨텐츠 브라우저 세팅에서 보여주게 켜야 함
이제 잘 보임
Plugins 카테코리에서 자유롭게 추가 및 삭제 가능
게임 빌드
- 게임 타켓 설정을 추가하면 게임 빌드 옵션이 추가됨
- 게임 타겟으로 빌드된 모듈은 정적 라이브러리로 실행 파일에 포함됨
- 게임이 실행되기 위해서는 실행 파일과 콘텐츠 애셋이 함께 있어야 함
- 빌드 : 실행 파일을 생성하기 위한 컴파일
- 쿠킹 : 지정한 플랫폼에 맞춰 콘텐츠 애셋을 변환하는 작업
- 패키징 : 이들을 모두 모아서 하나의 프로그램으로 만드는 작업
* 게임 패키지 : 실행 파일 + 컨텐츠 파일
게임 타겟 지정 후 언리얼 빌드 툴 가동
원래 여기에 에디터밖에 없었는데 게임 타겟 지정 후 늘어남
저기서 쉬핑이 사용자한테 배포할 최종 게임의 코드를 만들어내는 작업
이때는 모든 코드들이 최적화되어 들어감
check()나 ensure()같은 어설션 매크로들은 쉬핑 빌드에서 제외됨
쉬핑 모드에서 빌드하니 exe 파일이 나옴
실행하면 에러뜨는데, 게임 실행 파일은 만들었는데 게임에 필요한 애셋이 없어서 프로그램 실행이 불가능하다는 뜻
그래서 게임 애셋을 대상 플랫폼으로 튜닝해서 묶은 애셋 모음이 필요함 => 쿠킹
다시 Development Editor 모드로 바꾸로 에디터 실행
플랫폼 선택해서 쉬핑 선택하고 패키지 프로젝트 하면 쿠킹이랑 빌드 같이 해줌
폴더 하나 만들어서 지정하고 패키징하고 안에 들어가면
exe 파일 있음
실행도 잘 됨
'언리얼 엔진 > Unreal C++' 카테고리의 다른 글
[UE] Package (0) | 2025.01.01 |
---|---|
[UE] Serialization (직렬화) (0) | 2024.12.30 |
[UE] Memory Management (0) | 2024.12.29 |
[UE] Unreal Container Library / Struct, Map (0) | 2024.12.28 |
[UE] Unreal Container Library / TArray, TSet (0) | 2024.12.28 |