※ Android에서만 적용되는 것은 아닙니다. 이 글에서는 Android용으로 개발된 Unity 엔진 기반 게임에서 에셋을 뽑아내는 방법에 대해 다루며, 다른 플랫폼용으로 개발된 Unity 엔진 기반 게임이라도 에셋 파일을 뽑았다면 UABE로 에셋을 뽑을 수 있는 것은 매한가지입니다.
적지 않은 수의 안드로이드 게임들이 유니티 엔진으로 만들어졌다는 것은 세심하게 들여다 보았다면 쉽게 눈치챌 수 있습니다. 게임 인트로에 떡하니 유니티 로고가 박혀있으니까요. 한때 유명세를 끌었던 '소녀전선'도 유니티 엔진으로 제작된 게임입니다.
제한이 걸리기는 해도 개인용으로 무료라는 점은 게임 개발자 입장에서는 상당한 매력입니다. 그래서 더 많이 쓰인 것일지도 모르죠.
게임을 플레이하다 보면 그 게임에 나오는 음악이나 이미지 등을 따로 뽑아서 보고 싶을 때가 있습니다. 현 저작권법상 개인 사용 목적이라면 문제가 되지 않으니 뜯어서 보는 것 자체는 문제가 없습니다. 다만 어디에 그 데이터가 있을까요?
대다수의 게임들은 필요로 하는 데이터의 용량이 어마어마하기 때문에, 안드로이드의 내장 메모리에 OBB 파일로 데이터를 따로 저장하곤 합니다. 그렇지 않은 경우라도 /data/data
등의 별도로 된 저장공간에 데이터를 저장하거나 APK 파일 내부에 통째로 저장하기도 합니다. 이러한 특징에서 우리는 시작합니다.
에셋 파일 얻기
게임 데이터 파일을 에셋(Asset)이라고 합니다. 에셋을 뒤져서 우리가 원하는 파일을 찾아내는 방식입니다. 그러려면 먼저 에셋 파일이 있을만한 위치를 찾아야 합니다. 하지만 게임 제작자마다 에셋을 어디에, 어떤 방식으로 저장하는지 다릅니다. 앞서 말했듯이 APK 파일 내부에 두는 경우도 있고 /sdcard/Android/obb
경로에 OBB 파일 형식으로 저장하거나 /data/data
같은 앱별로 할당된 개별 저장공간에 넣는 경우도 있습니다.
일반적으로 파일명이나 경로명에 해당 게임의 패키지명이나 게임명이 들어가므로 그것을 힌트로 삼아 찾습니다.
/data/data
에 위치한 경우
불행하게도 이 영역은 앱별로 개별 할당되는 저장공간입니다. 따라서 루트 권한이 없으면 이 영역에 접근할 수 없습니다. 본인의 스마트폰이 루팅되어 있다면 접근할 수 있지만 루팅되어 있지 않다면 '블루스택'이나 'NOX 앱플레이어'등의 에뮬레이터를 루팅해 접근해야 합니다./sdcard/Android/obb
에 위치한 경우
OBB 확장자로 된 큰 파일이 하나 있거나, 안에 파일들이 가득한 폴더가 있습니다.- APK 파일 내부에 위치한 경우
앱의 데이터는 대부분의 경우 저 세 곳 중 한 곳에 위치합니다. 하지만 앱에 따라서 여러 곳에 다른 데이터를 저장하는 경우도 있으니, 모든 경우의 수를 확인하는 것이 좋습니다.
단순히 해당 폴더의 내용물을 전부 복사해서 PC로 옮겨오면 다른 앱의 내용물도 같이 복사될 수 있으니 정확히 원하는 앱의 패키지명이 적힌 폴더나 파일만을 복사해올 수 있도록 합니다.
원하는 에셋 찾기
에셋 파일을 PC로 복사했다고 끝이 아닙니다. 이 중에서 본인이 원하는 에셋 파일을 찾아야 합니다. 단, 게임마다 에셋을 어떻게 저장할지 다르므로 본인이 알아서 찾아야 합니다. 파일이 어떤 형식으로 저장되어 있는지, 어떤 이름을 갖고 있을지 알 수 있는 방법이 없습니다.
이번 예시에서는 'Lanota'라는 리듬 게임을 예시로 들어보겠습니다. 이 게임은 원하는 파일이 알아보기 쉬운 이름으로 되어 있습니다.
에셋 파일은 /sdcard/Android/obb
경로에 OBB 파일로 위치해 있습니다. OBB 파일은 확장자만 다른 ZIP 파일로 간주해도 좋으므로, 압축을 풀어두었습니다.
MANIFEST 파일은 같은 이름의 확장자 없는 파일의 내부에 어떤 파일이 들어있는지 알려주는 지표 역할을 합니다. 따라서 파일이 어떤 파일인지 명확하게 와 닿지 않는다면 MANIFEST 파일을 열어보면 됩니다. 가령 androgynos1.manifest
파일은 androgynos1
파일 내부에 무엇이 있는지 알려줍니다.
하단부의 Assets:
밑 줄을 보면 androgynos1
파일 내부에는 androgynos1.mp3
파일이 있음을 알 수 있습니다. 저는 이 MP3 파일을 원하므로 androgynos1
파일을 다른 경로에 복사해둡니다.
원하는 파일 추출하기
방금 복사한 파일을 팟플레이어 등의 프로그램에서 열면 파일을 읽을 수 없다는 식의 오류 메시지를 출력합니다. 이는 해당 파일이 유니티 엔진만이 해석할 수 있는 방식으로 압축되어 있기 때문입니다. 따라서 그 압축을 해제하면 내부의 원하는 파일을 얻을 수 있습니다.
'Unity Assets Bundle Extractor'라는 프로그램이 있습니다. 이 프로그램은 유티니 엔진만이 해석할 수 있는 방식으로 압축된 에셋 파일의 압축을 해제할 수 있습니다. 이 프로그램을 다운로드합니다.
※ 추가(2021.11.28)
UABE는 2019년을 마지막으로 업데이트가 되고 있지 않습니다. 따라서 UABEAvalonia(혹은 UABEA)를 사용하는 것을 권장합니다. UABEA는 UABE와 UI의 구성이 상당히 유사하므로 아래의 강좌를 그대로 적용할 수 있습니다.
또한 이 강좌에서는 UABE를 에셋의 수정에 사용하지 않고 단순 추출에 사용하므로, AssetRipper나 AssetStudio도 사용해 볼 수 있습니다.
본인 OS가 64비트이고 에셋 파일의 크기가 매우 크다면 64비트 버전을 다운로드하는 것이 좋습니다. 잘 모르겠다면 32비트 버전을 쓰면 됩니다.
UABE를 실행하면 위와 같은 창이 나타나는데, 'File - Open'을 눌러 아까 따로 복사했던 파일을 선택합니다.
이 파일이 압축이 되어있다면 이러한 메시지를 출력하면서 압축을 해제할 것인지 묻습니다. '예'를 선택하면 파일을 저장할 위치를 물어봅니다. 방금 열었던 파일과 동일한 위치에 다른 이름으로 저장합니다. 이때 같은 이름으로 저장하면 안 됩니다. 이는 UABE가 파일을 언팩한 후, 언팩한 파일을 다시 열기 때문이며 원본 파일을 덮어쓰게 되면 오류가 발생합니다.
androgynos1
파일과 같은 경로에 androgynos1_unpack
이라는 이름으로 저장합니다.
언팩된 파일을 저장하면 비어있던 항목에 이런저런 정보가 나타납니다. 이름은 androgynos1
이라고 되어 있지만, 실제로 열려있는 파일은 androgynos1_unpack
파일입니다.
'Info' 버튼을 눌러 내부 파일 구조를 확인합니다.
Type이 AudioClip인 파일이 보입니다. 아까 MANIFEST 파일에서 확인했던 정보에서 우리가 원했던 파일은 MP3 확장자의 음악 파일(오디오 클립)이었으므로 이 파일을 추출해야 합니다.
해당 항목을 클릭해 선택한 후, 우측의 'Plugins' 버튼을 누릅니다. 이때 항목을 선택하지 않고 우측 버튼을 누르면 오류 메시지가 나타납니다.
Export Sound가 기본적으로 선택되어 있습니다. 'OK' 버튼을 눌러 오디오 파일을 다른 이름으로 저장합니다. 이때 WAV 파일로 저장되는데, 나중에 원하는 형식으로 인코딩하면 됩니다.
이러한 방식으로 다른 형식의 파일도 추출할 수 있습니다. 오디오던 이미지던 상관없습니다. 아마 이미지라면 'Plugins' 창에서 다른 플러그인이 선택되어 있을 것입니다.
추출한 에셋은 반드시 혼자 사용해야 합니다. 엄연히 이러한 파일들에도 저작권이 존재하는 만큼, 배포 등의 행위는 처벌 대상이 됩니다.