이번글은 언리얼 엔진의 빌드 과정과 기존의 블루프린트 프로젝트를 C++프로젝트로 변환을 어떻게 하는지에 대해 알아보는 글입니다.
언리얼 엔진을 빌드를 하면서 기초적으로 알아야 할 부분은 아래와 같습니다.
- Solution Configuration
- Solution Platforms
- Module
- Builds Rules, TargetRules
Solution Configuration
간단하게 말하면 언리얼 프로젝트를 빌드하는 Configuration을 설정하는 부분입니다.
언리얼 프로젝트를 c++로 만들었을 때
여기서 위에 보이는 Development Editor라는 부분인데요.
해당 부분의 Cofiguration을 설정하여 사용자에게 배포할 목적으로 빌드할 것인지, 디버깅용 또는 개발용으로 c++프로젝트를 빌드할 것인지 설정할 수 있습니다.
Configuration에 구성관리자를 누르시면 뜨는 화면인데요 제가 만든 c++프로젝트 파일은
Confoguration(구성)을 제가 목적에 맞게 설정할 수 있는데 UE5프로젝트의 경우에는 이를 설정할 수 없습니다.
왜 그런가 하면 저희가 Unreal엔진을 이미 공식홈페이지에서 에픽게임즈 런처를 통해 빌드된 것을 설치받았기 때문이죠
그래서 언리얼 프로젝트를 따로 빌드할 Configuration을 설정하는 부분이 없는 것입니다.
빌드를 할 수는 있지만 시간이 엄청 오래 걸리고 저같이 아직 초보자 인분들은 VS IDE의 설정과 Project Solution 설정, Configuration값들을 수정하지 않는 것을 추천드립니다.
(괜히 건드렸다가 문제가 발생하기 쉽습니다.)
위의 Configuration들을 보면은
- Debug / Debug Editor의 경우, 다른 Configuration 보다 디버깅 관련정보들들이 많이 빌드되기 때문에 프로그램 실행속도가 가장 느립니다.
- Development / Development Editor의 경우, 개발에 관련된 부분만 빌드를 하기 때문에 Shipping과 Debug Configuration의 중간 정도의 프로그램 실행속도를 가집니다.
- Shipping의 경우 Editor가 안 붙어 있는 이유는 사용자에게 배포할 Configuration이므로 굳이 Editor는 필요하지 않기 때문에 Editor가 없습니다.
Modules
일단 저도 처음에 Module이라고 했을 때 이해하기가 어려웠습니다...
정말 입문하시는 분이시라면 Build.cs파일과 헤더파일, cpp파일의 모음? 정도라고 생각하시면 될 거 같습니다.
위의 사진은 ThirdPerson_5 dot1이라는 이름으로 C++프로젝트를 만들고 나서. uproject파일을 노트패드로 열었을 때 파일 데이터들입니다.
언리얼 엔진에서는 하나의 프로젝트 내에서 여러 개의 Module을 만들어 낼 수 있는데 Module은 Build의 결과물을 정의하는 데 사용됩니다. 모듈 N개가 있을 경우 빌드 결과로 N개로 나오게 됩니다.
빌드의 결과로 빌드결과물이 하나도 안 나올 경우 해당 프로젝트는 "블루 프린트"로 만들어진 프로젝트라 볼 수 있습니다.
실제로
위에 사진은 제가 테스트용으로 TestModule을 기존 모듈(ThridPerson_5 dot_1)에다가 하나를 더 추가한 모습인데 이를 실제로 빌드를 할 경우 Binaries -> Win64 경로로 가보시면
이렇게 각각의 모듈마다의 dll파일들이 생성된 것을 확인할 수 있습니다.
.dll 파일형식으로 빌드결과가 나오는 이유는 Unreal Engine은 빌드된 결과물을 바탕으로 에디터를 띄워주는데 일반적으로 CPP프로그램에서 CPP파일들의 기능들을 취합하는데 .dll파일의 형식이 쓰이기 때문에 그렇습니다.
참고로. pdb파일을 디버깅할 때 필요한 데이터가 있는 파일입니다.
(Binaries 현재 빌드결과는 모듈을 성공적으로 추가를 했을 때 결과 이므로 아래에 설명하는 부분과 혼동 없으시길 바랍니다)
그렇다면 실제로 언리얼 엔진이 이를 인식할 수 있는지 C++로 만든 프로젝트의 .uproject 설정을 수정을 해보도록 하겠습니다.
먼저 위와같이 .uproject에 Module이 있다고 명시를 한경우 C++프로젝트로 생성된 언리얼 프로젝트를 열면은 당연하게도 아래와 같이 프로젝트내에 C++파일폴더와 클래스들을 볼 수 있습니다.
이후 .uproject를 노트패드로 연다음 아까 적어두었던 TestModule이라는 부분을 지우고 난뒤
언리얼 엔진을 열었을 때 엔진이 해당 프로젝트를 블루프린트 프로젝트라 인식하여 기존에 있던 C++ 폴더가 아래와 같이 보이지 않습니다.
따라서 .uproject에 Module정보가 명시되어 있지 않으면은 해당프로젝트를 블루프린트 프로젝트라 볼 수 있습니다.
실제로 언리얼 프로젝트르 블루프린트 프로젝트로 생성후 .uproject를 열어보면 Module부분이 없습니다.
반대로 모듈정보가 명시되어있을 경우 C++프로젝트라 볼 수 있습니다.
기존의 블루프린트 프로젝트에서 C++프로젝트로 변환할려면 Module을 만들어야 한다는 것을 어느정도는 이해가 됩니다.
그렇다면 Module이란 것은 어떻게 만들 수 있을까요?
아래의 사진은 C++프로젝트를 생성한 뒤 Source폴더 내부를 들어갔을 때입니다.
Build.cs 파일이 보이는데요.
이것은 언리얼 엔진 자체가 독자적인 빌드절차를 구축하는데 C# 프로그램을 적극적으로 사용하기 때문입니다.
따라서 하나의 Module이라는 것은 Module이름.Build.cs와 여러개의 header, cpp파일 이러한 것들로 구성이됩니다.
(물론 이것들은 하나의 폴더안에 들어가 있는 것을 권장합니다.)
저처럼 하나의 프로젝트에 TestModule과같은 모듈을 추가하고싶을 경우
ThridPerson.5_dot1.cpp파일에서
IMPLEMENT_PRIMARY_GAME_MODULE라고 되어있는데 이는 프로젝트내에서 하나만 존재가 가능하므로.
TestModule.cpp로 가셔서 IMPLEMENT_GAME_MODULE 로 수정하고 세번째 인자를 지워주셔야 합니다.
위와같이 추가한 모듈은 이런식으로 해주셔야 합니다.
제가 위에서 말씀드렸지만, 모듈 N개당 N개의 빌드결과가 나와야 한다고 말씀드렸는데요
현재 솔루션 파일을 빌드하게되면 TestModule에대한 빌드결과물은 없고 ThirdPerson에 대한 빌드 결과물만을 확인할 수 있습니다. (아까 위에서 TestModule빌드 결과가 나온것은 잊으시면됩니다)
그래서 저희는 프로젝트 파일에서 제대로 인식할 수 있게 해주어야합니다.
.uproject파일에서 우클릭 후 Generate visual stuido file를 클릭해주시면 해주시면 언리얼 툴이 현재 Source폴더 구조를 분석해준다음 적절하게 프로젝트파일을 갱신을 해주게 됩니다.
이후 아래와같이 모듈이 추가가 된 것을 확인하실 수 있습니다.
하지만 빌드를 할 경우 여전히 TestModule에 대한 .dll파일을 나오지 않고 있는데 이를 해결하는 방법을 알아보겠습니다.
Solution configuration
빌드 결과물이 안나오기 때문에 에디터가 안열리고 있는데 이는 언리얼 엔진이 TestModule이 필요없다라고 스스로 판단하여 제외를 시킨상태에서 빌드를 했기 때문입니다.
이것은 Target때문인데 Target의 개념을 아셔야합니다.
언리얼 엔진은 .Target.cs파일들을 참고를 해서 특정 Solution Configuration일 때 Build가 필요한 Module이 무엇인지 판단을 합니다.
그래서 .Target.cs 파일들에 굳이 명시되어 있지 않은 모듈일 경우 빌드를 하지 않았던 것입니다. (프로젝트 파일에 추가가 되어 있다 하더라두요)
기존의 Target.cs파일들을 확인을 하시면 아마 저와 비슷하시거나 똑같을 겁니다.
ExtraModuleName.Add를 통해 모듈을 추가를 한 것인데요 에디터는 여기서 추가된 모듈을 참고를 해서 빌드를 진행합니다.
.Target.cs파일들을 아래와 같이 수정을 하고 다시 빌드를 하시면
아래와 같이 빌드 결과물들을 확인할 수 있습니다.
그럼 저희가 추가적으로 넣은 모듈도 인식이 잘되었고 빌드결과도 잘 나왔으니 언리얼 에디터는 이런 빌드된 .dll파일들을 바탕으로 에디터를 띄워줄 수 있습니다!
좌측하단에 모듈 정상적으로 추가가 된것과 정상적으로 에디터가 열린것을 확인했습니다!
C++클래스 만들기
아래와같이 클래스타입을 설정할 수 있는데 Public, Private둘중 하나를 골라주시면 됩니다.
일반적인 경우에는 그냥 Private으로 설정해주시면됩니다.
Public은 다른 모듈에서 해당 클래스를 사용할 수 있도록 열어둔다는 의미입니다. 하지만 일반적으로 모듈간 클래스를 공유할 일이 많지않기 때문에 Private으로 설정해주신다음에 생성해주시면 됩니다.
CPP파일을 생성하는 방법은 두가지가 있는데
하나는 Source폴더내에서 직접 .h, .cpp파일을 생성한후에 Generate Visualstudio Project File를 통해 VS가 변경한 부분들을 인지할 수 있게 한다음 다시 솔루션파일을 재빌드해서 에디터를 여는 방법.
다른 하나는 에디터 상에서 위의 사진과 같이 직접 클래스를 추가하는 방법입니다.
두가지의 장단점이 분명 존재합니다.
후자의 경우 cpp파일을 추가하는 것은 간단하고 쉽지만, 규모가 큰 프로젝트의 경우 에디터상에서 cpp클래스를 하나 추가를 하는경우 언리얼 에디터가 직접 파일도 추가를 해주고 빌드를 자동으로 해주는데 이럴경우 빌드시간이 20분 30분 이런식으로 걸릴 수가 있습니다.
따라서 전자의 방법으로 여러 cpp파일들과 헤더를 만들어준다음에 빌드를 한번만 진행하면 되니까 큰 규모의 경우에는 전자의 방법이 효율적이라 판단할 수 있습니다.
반면 규모가 작은 경우에는 후자의 방법을 통해서 추가를 해주어도 무방합니다.
다만, 후자의 방법 에디터상에서 직접 cpp클래스를 만드는 경우 문제가 있습니다. 에디터를 닫지않은 상태에서 클래스를 추가한뒤 빌드를 에디터가 진행을 해주기 때문에 "빌드 결과가 한층 더 쌓이는" 결과가 발생합니다.
Biaries폴더를 보면은 .patch_0이 붙은 파일들을 확인 할 수 있습니다.
따라서 계속 cpp파일을 추가할 경우 Biaries폴더 크기가 커지게 됩니다. 또한 Biaries폴더안에 있는 파일들은 수동으로 삭제를 해주셔야합니다.
또한 더 문제가 있는데 에디터를 닫고나서 다시 에디터를 실행할경우 추가해주었던 cpp파일들이 보이지 않는 모습을 볼 수 있는데 이는 patch가붙은 파일들을 실행한게 아니라 .dll을 바로 실행했기 때문에 에디터 상에서 보이지 않게 된것입니다.
따라서 에디터에서 cpp파일을 추가한경우 patch가 붙은 파일들은 다 삭제를 하고 솔루션 파일을 다시 빌드를 해서 최신상태로 만들어주시는 것이 정신건강에 좋습니다 :)
'UE5' 카테고리의 다른 글
[UE] ArcheType (0) | 2023.12.31 |
---|---|
[UE] GetOuter() (0) | 2023.12.24 |
[UE] StaticClass (0) | 2023.11.29 |
[UE] Unreal5 Live Coding쓰면 지양??해야 하는 이유 (+빌드) (0) | 2023.05.02 |
[UE] Unreal5 TObjectPtr<>, TSubclassOf<> 에 대해 (0) | 2023.04.20 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!