본문 바로가기
Unreal/Script

언리얼 모듈 만들기

by Pretty Garbage 2018. 7. 8.

(이 포스팅은 언리얼 4.19.2 기준으로 작성되었습니다.)

(사진은 클릭하면 크게 볼 수 있습니다.)

 

언리얼 엔진 공식 카페에 들어가보면 수많은 좋은 강의를 접할 수 있는데 그중 이득우님의 강의를 보면서 열심히 따라가던 중...

 

 

 

모듈 제작에서 막혔다... 어...?? 똑같이 따라한 것 같은데 왜지?!

 

 

 

일단 언리얼 빌드 시스템은 모듈 시스템으로서 구성되어 있습니다.

 

언리얼의 모듈시스템이란 Source 폴더 아래의 모듈 이름의 폴더를 갖으며 이 폴더 아래에 소스코드들이 자동으로 빌드가 됩니다.

하나의 Build.cs파일이 필요로 하며 이 파일에는 이 모듈이 참조하는 모듈들 설정, 빌드 관련 옵션에 관한 정보가 담겨집니다.

 

그리고 프로젝트 실행시에 포함되는 모듈은 Target.cs 파일에 설정되어집니다.

 

어쨌든 이 모듈은 기본적으로 최소 1개 이상의 모듈이 필요로하고 이 프로젝트 모듈들은 .uproject 파일에 설정되어집니다.

 

 

바로 이부분입니다.  (이득우님 강의 따라가면서 WebService라는 모듈을 추가하였습니다.)

 

 

제 방법이 맞는건지는 모르지만 일단 오류없이 빌드가 되었기에 올렸고 이 방법이

 

WebService라는 모듈을 제작하기위해서 WebService.cpp와 h(헤더파일)을 생성하여 작성해줍니다.

 

 

1. 헤더파일 (WebService.h)파일에

 

#include "Engine.h"
#include "CoreMinimal.h"

 

이렇게 추가했는데 알아본 결과

둘중 하나만 추가해도 될 것 같습니다. 정확히는 CoreMinimal.h만 추가해주어도 됩니다.

 

Engine.h는 꽤 커다란 정보를 담고있는 헤더파일인 것 같고...

(4.15 릴리즈 정보에 보면 커다란 모놀리식 헤더 포함 모든 소스 포함 이라고 나오네요.)

 

CoreMinimal.h는 Core의 어디에나 존재하는 유형의 세트가 들어있으며 이제 대부분의 헤더에 포함된다고 합니다.

 

꼭 필요한 최소한의 정보만 들어가 있어서 컴파일 속도를 개선했다고 생각하면 좋을 것 같습니다.

 

#include "CoreMinimal.h" 를 추가해줍니다.

 

 

2. cpp 파일을 찾아갑니다.

 

우선 설명하기에 앞서 언리얼 내의 최소 한개의 모듈은

 

IMPLEMENT_PRIMARY_GAME_MODULE 키워드로 선언되어야 합니다.

 

자세한 부분은

http://api.unrealengine.com/KOR/Programming/Modules/Gameplay/index.html#%EB%8B%A4%EC%A4%91%EA%B2%8C%EC%9E%84%ED%94%8C%EB%A0%88%EC%9D%B4%EB%AA%A8%EB%93%88

참조!

 

다만 이곳에서도 업데이트 안된건지 저대로 하면 안되는데...

 

위와 같이 PRIMARY_GAME_MODULE일 경우(FDefaultGameModuleImpl, 모듈클래스이름, 모듈이름문자열)로 등록해 줍니다.

 

 

 

이후 PRIMARY로 선언된 모듈이 있다면 IMPLEMENT_GAME_MODULE로 대체할 수 있다고 하는데 설명에는

IMPLEMENT_PRIMARY_GAME_MODULE( <ModuleName>, "<GameName>" );

이러한 폼으로 설명되어집니다만

 

위 화면과 같이 <FDefaultGameModuleImpl,"모듈이름문자열")로 명시해줘야 에러가 안뜹니다...

 

 

3. 그리고 모듈에는 h,cpp,Build.cs 이 세가지로 이루어지는데 마지막 그 Build.cs 파일 입니다.

 

여기서 엄청 애를 먹었는데요.

 

 

잘 보이실런지 모르겠는데 강의 내용대로 따라갔다간 접근 권한부터 시작해서 매개변수가 0인 생성자는 없다느니 온갖 에러를 접하게 됩니다.

 

쉽게 말해서 기본으로 생성된 모듈이 있다면 참고해서 모듈이름만 바꿔주는게 마음 편합니다..

 

단 모듈들이 배열로 추가된 11번째줄 코드에서 InputCore는 입력에 관한 모듈이기 때문에 제외해도 무방하다고 합니다.

 

또한 9번째 줄 PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;

 

이 부분을 빼먹으시면 나중에 오브젝트 만들때 에러를 경험하게 되십니다...

 

아마 이부분은 위에 설명드렸지만 4.15 업데이트 이후부터 영향을 받는 것 같은데 IWYU(Include what you use) 를 켜줘야 되는 것 같습니다. 모놀리식 헤더 파일(Engine.h UnrealEd.h)와 같은 컴파일을 지양하고 반드시 필요한 모듈만 include 하도록 지향하도록 바뀌었다고 하네요.

 

어쨌든 이 IWYU를 켜기 위해서 저 위에 코드를 추가해도록 합시다.

 

저 규칙을 도입한 뒤로부터 컴파일의 속도가 크게 빨라졌다고합니다.

 

참고 URL : http://api.unrealengine.com/KOR/Programming/UnrealBuildSystem/IWYUReferenceGuide/

 

 

이렇게 추가해주시고.

 

4. 언리얼 에디터로 돌아와서 새로운 C++파일 만들기!

 

그리고 모든 클래스에 체크하고 Object 로 하나 만들어주도록 합니다.

 

 

이름을 적어주고 파란색으로 동그라미 친곳을 클릭해보면 추가되어진 모듈이 보여집니다. 선택하고 클래스 생성!

 

그러면 뭐 컴파일에 실패했다느니 혹은 성공했다느니 나올텐데

무시하고 비주얼 스튜디오에 들어가서 다시 빌드 해주시고 에디터로 돌아와서 컴파일 해주면

 

 

 

위와 같이 에디터에서도 모듈이 추가되었음을 확인할 수 있다.

 

 

이 과정이 숙련되지 않았다면... 각 단계마다 빌드하고 에디터로 돌아와서 컴파일 하고 에러 확인하고 이 과정을 되풀이 하시길 권장합니다.

 

정신건강에 해롭네요. 새벽 6시간내내... 삽질 한 결과였습니다.

 

감사합니다.

 

 

 

잘못된 정보가 있으면 댓글로 알려주시면 감사히 받아들이고 적용하도록 하겠습니다.

 

 

 

 

 

 

 

 

 

 

'Unreal > Script' 카테고리의 다른 글

C++ 11 및 최신 언어 문법.  (0) 2018.07.05
UPROPERTY란 무엇일까?  (0) 2018.07.01
Header 파일에 붙는 UCLASS란 무엇일까?  (0) 2018.06.30