요약
- 팰월드에는 별도 모드 시스템이 없음.
- 언리얼의 pak파일 구조를 이해하면 간단한 애셋 치환 모드를 만들 수 있다.
PalWorld
2024년 새해 벽두 가장 핫한 게임을 꼽으라면 무엇일까요. 이견도 좀 있겠지만 유저수 대비로나 성장률을 보나 팰월드이지 않을까 싶습니다. 최근에는 수십시간 이상 한 게임이 거의 없다시피 했는데 팰월드만큼은 수면 부족을 걱정했을 정도로 열심히 즐겼습니다. 아직 미리 해보기 게임이라 정식 출시가 기대되기도 합니다.
모드
가장 많은 관심을 받는 게임인 만큼 모드 제작도 활발합니다. 넥서스모드에만 가 보아도 이미 많은 수의 모드가 나와 있습니다. 게임 자체도 언리얼 엔진 5로 제작되어 나름 업계인(?)으로써 관심을 가질 수밖에 없었는데요. 특히 애셋 치환 모드가 궁금했습니다. 애셋 치환의 경우 모드 파일을 {게임이름}/Content/Paks/~mods
폴더에 넣으라는 경우가 대부분이었습니다. 왜 대부분 저 폴더로 알려주는지 그 이유가 궁금해서 따로 설정이 되어있는지 게임을 까보기로 했습니다.
애셋 분석
대개 언리얼 엔진은 *.pak
파일 형식으로 컨텐츠가 묶여 배포되는 방식입니다. 최근에는 젠 로더라는 게 추가되어 pak 파일을 더 확장하려는 것 같습니다. 당장은 팰월드에서 기본 pak파일을 사용하고 있으니 pak 기준으로 설명해 보겠습니다.
pak파일은 언리얼 엔진에 기본으로 포함되는 Engine/Binaries/Win64/UnrealPak.exe
를 커맨드라인에서 열어볼 수 있습니다. 모딩용 툴인 FModel을 사용하면 깔끔한 ui와 함께 볼 수 있어서 FModel을 쓰는 것을 권장합니다.
처음에는 게임 경로가 설정되어있지 않기 때문에 게임 경로를 본인의 환경에 맞게 설정해주어야 합니다. 마지막에 꼭 +버튼을 눌러 등록을 해야 제대로 불러와집니다.
잘 로드가 된 것 같습니다. 여기서 Pal-Windows.pak가 실제 모델링이나 텍스쳐가 들어있는 파일입니다. 더블클릭하면 Folders 탭으로 넘어가 파일 목록들을 전부 볼 수 있습니다.
Packages 탭을 가면 .uproject 파일이 있고 거기에 사용한 플러그인들이 나열되어 있는데 딱히 모드와 관련된 내용은 보이지 않는 것 같습니다. 그나마 관련 있는 것이 GameFeature이 그나마 비슷하지만 다른 구현체 플러그인이 없는 걸 보아 실제로는 사용되지 않는 것 같습니다.
애셋 분석으로는 성과가 없는 것 같으니 엔진 소스도 한번 살펴보겠습니다.
엔진 코드 분석
우선은 언리얼 엔진 코드를 받아야 합니다. 자세한 방법은 언리얼 엔진 소스 코드 내려받기 가이드를 참고하면 됩니다. 처음 받는 것이라면 다운받는 데 시간이 좀 걸립니다.
코드 분석은 크게 어렵지 않습니다. 앞서 설명했듯 Paks
폴더가 핵심이기 때문에 “Paks” 문자열을 사용하는 부분을 전체 코드에서 검색해 보았습니다.
다행히 두곳에서만 나오는군요.
해당 부분은 저런 코드인데 폴더 경로가 FCoreDelegates::OnMountAllPakFiles
로 전달됩니다. 다시 검색 신공을 써 봅니다.
FPakPlatformFile::MountAllPakFiles
폴더로 호출이 이어지는군요.
거의 다 왔습니다. 여기서 FindAllPakFiles
을 통해 pak 파일들을 배열에 저장하고 그 순서대로 메모리에 로드하는 것으로 보입니다. 아래 보면 마운트하기 전에 Sort 함수를 사용하는 것을 보니 알파벳 역순으로 로드가 되는 것을 보입니다.
이제 윤곽이 어느 정도 보입니다. 정리하자면 이렇습니다. - 기본적으로 pak파일은 Content/Paks 폴더에 있는 모든 pak파일을 로드합니다. - 로드되는 순서는 알파벳 역순입니다. - 모드를 제작하고 pak파일로 묶어 이름은 아무거나 지정하여 넣어도 게임에서 읽어집니다. - ~mods
와 같은 이름으로 순서가 더 먼저 오도록 만들면 더 확실하게 모드 파일을 적용시킬 수 있습니다.
배포
모드 제작을 했고 pak파일을 어디에 넣어야 하는지도 알았습니다. 그렇다면 pak파일은 어떻게 만들까요? 당연하게도 언리얼 에디터에서 애셋 패키징을 하면 가능합니다.
모딩위키에 단계별로 잘 설명되어 있으니 참고하시기 바랍니다. 내용을 짧게 정리하면 이렇습니다.
- 기존 애셋과 동일하게 폴더 구조 구성
- 치환할 애셋에 청크 번호 할당
- 프로젝트 패키징
- 필요한 청크번호의 pak파일만 취득하여 테스트
마치면서
대개 모딩은 개발사가 공식적으로 지원하지 않는 이상 일종의 해킹의 영역으로 보이기도 합니다. 언리얼 엔진을 사용한 프로젝트의 경우 이렇게 살펴본 방법으로 손쉽게 모딩이 가능하여 모더들에게 큰 이점을 주는 것 같습니다. 이외에도 RE-UE4SS와 같이 스크립팅을 곁들여 특이한 동작도 만들 수 있게 해 주는 도구들도 많이 있습니다. 잘 활용한다면 게임 그 이상의 재미를 찾을 수 있으리라 생각합니다.
'Programming > Unreal Engine' 카테고리의 다른 글
UMG 드로우콜 분석 (4) | 2022.08.28 |
---|---|
[UE4] 2D 게임용 콘솔 변수 설정하기 (0) | 2021.12.29 |
안드로이드 ndk 디버그하기 with gdb (0) | 2019.02.23 |
언리얼 애셋 의존성 관리 (0) | 2017.08.01 |