Unity 게임에서 영상재생시 사용되는 VideoClip asset을 지원하는 모딩 툴이 별로 없다.
Import는 고사하고, Export를 지원하는 툴마저 몇 없다.
내가 확인한 바론, 아직까진 UnityEX 및 UnityPy(커스텀 클래스)만이 지원하는 거로 보인다.
UnityEX는 유료이기에 사용자마다 사용에 무리가 있을 수 있고, UnityPy는 기본적인 사용법을 알아야 하기에
이 글은 UABEA를 이용한 VideoClip asset 수정법을 다룬다.
예시 게임
- MINDHACK Demo ( https://store.steampowered.com/app/1727210/MINDHACK/ )
필요 툴
- AssetStudio: https://github.com/aelurum/AssetStudio/releases
- ffmpeg: https://www.gyan.dev/ffmpeg/builds/ffmpeg-git-full.7z
- UABEA: https://github.com/nesrak1/UABEA/releases
- HxD: https://mh-nexus.de/en/downloads.php?product=HxD20
1. 대상 파악
게임 실행 후 NewGame 메뉴를 누르면 Process~ 문자열이 타이핑되는 영상이 재생된다.
이 영상을 이번 목표로 해보자.
참고로, 이 게임에는 영어 버전/일어 버전의 영상이 모두 들어있다.
보통은 이런 영상을 추출한 후 한글화 작업을 진행한 다음 다시 삽입하겠지만,
지금은 기록용으로 남기는 글이기에 영어 영상을 일어 영상으로 대체하겠다.
2. 영상 추출 (편집은 알아서)
AssetStudio에 게임 파일을 로드한 후,
상단 메뉴바 Filter Tyle - VideoClip을 체크하면 VideoClip 타입의 에셋만 보이게 된다.
이후 Export - Filtered assets를 누르면 VideoClip이 전부 .mp4 파일로 추출된다.
이 추출된 영상 중 본인이 바꾸고 싶은 영상을 잘 골라낸 다음, 한글화를 하면 된다.
이번 대상은 #716번 에셋, MH_OP_rough이다.
3. 편집한 영상의 정보 파악
편집한 영상을 파악하기 전에, 우선 수정해야 할 VideoClip의 정보에 대해 파악하자.
UABEA로 해당 에셋을 덤프뜨자.
우측 메뉴 - Export Dump 버튼을 이용하면 된다.
뭐가 굉장히 많지만, 사실 건들 곳은 별로 없다.
m_ProxyWidth, m_ProxyHeight, Width, Height: 수정한 영상의 너비/높이에 맞추면 된다.
m_FrameRate: 수정한 영상의 프레임에 맞추면 된다.
m_FrameCount: 수정한 영상의 총 프레임 수에 맞추면 된다.
m_AudioSampleRate > data: 수정한 영상의 오디오 샘플레이트에 맞추면 된다.
m_ExternalResources > m_Source: 임의의 파일명을 지정하면 된다.
m_ExternalResources > m_Offset: 0으로 설정하면 된다.
m_ExternalResources > m_Size: 수정한 영상의 파일 크기로 설정하면 된다.
위 부분들을 수정하기 위해선 수정한 영상에서 저런 정보들을 뽑아내야 한다.
그래서 그 정보들을 얻기 위해 ffprobe를 이용한다.
ffmpeg를 사이트에서 다운로드를 한 후 압축을 풀고, "bin"폴더 내 exe 3개를 영상이 있는 폴더에 이동시킨다.
ffprobe <영상파일>
# 예시) ffprobe jp.mp4
이후 해당 폴더에서 cmd를 열고, 위 명령어를 치면 스샷과 같은 화면이 보일 것이다.
정보들이 엄청 많이 뜨는데,
<Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'jp.mp4':> 위의 정보들은 ffprobe 컴파일 시의 정보이므로
영상과는 아무런 관계가 없으니 무시하자.
Stream #0:0[0x1](eng)쪽 내용들을 보면 비디오 코덱, 픽셀포맷, 영상 크기, 프레임 등의 정보들이 나온다.
Stream #0:1[0x2](eng)쪽 내용들을 보면 오디오 코덱, 샘플레이트 등의 정보들이 나온다.
VideoClip 수정에 필요한 정보 중
m_ProxyWidth/Width(1280),
m_ProxyHeight/Height(720),
FrameRate(30),
AudioSampleData(48000)
에 대한 정보를 알아낼 수 있었다.
ffprobe -v error -select_streams v:0 -count_packets -show_entries stream=nb_read_packets -of csv=p=0 <파일명>
# 예시) ffprobe -v error -select_streams v:0 -count_packets -show_entries stream=nb_read_packets -of csv=p=0 jp.mp4
다음으로 m_FrameCount를 알아내기 위해 위 명령어를 치면, 위 스샷과 같이 숫자 하나가 뜬다.
이것이 총 프레임 수다.
그냥 쓰지 말고, +1 한 값을 쓰자. (1893)
마지막으로 m_ExternalResources > m_Size를 알아내기 위해 HxD로 수정한 비디오를 열어보자.
하단에 길이(h): 411CDD3가 이 파일의 크기다.
16진수이므로, 16진수 -> 10진수 변환 사이트를 통해 10진수로 변환하자.
* 만약 파이썬이 설치되어 있다면, 16진수 앞에 0x를 붙이는 것 만으로 쉽게 변환이 가능하다.
4. VideoClip 덤프 수정
오른쪽이 수정한 영상의 값들이고, 왼쪽이 대상 VideoClip dump이다.
알맞게 수정해주자.
* 영상이 mp4 형태로 공개되는 게 싫은 경우, 위 캡처의 op_jp.resource처럼 임의의 이름을 지정해도 된다.
이런 식으로 수정하였다.
이제 UABEA로 다시 import dump하자.
또한, 수정한 영상파일을 {게임명}_Data 폴더에 놔두자.
이것으로 모든 작업이 완료되었다.
5. 결과 확인
게임 실행 시, 영상이 제대로 바뀐 걸 볼 수 있다.
'한글패치 관련 짧은 글들' 카테고리의 다른 글
catalog.json과 catalog.hash가 있는 유니티 게임의 수정법 (1) | 2024.12.18 |
---|---|
번역을 위한 유니티 Il2cpp 게임의 복호화/암호화 (0) | 2024.12.18 |
UnityPy TypeTree 적용 (작성중) (0) | 2023.09.15 |
XUnity.AutoTranslator에서 DeepL 사용하기 (17) | 2023.09.06 |
UnityPy를 이용한 bundle파일 내 Monobehaviour 일괄수정 (0) | 2023.08.29 |