한글패치 관련 짧은 글들

유니티 VideoClip 에셋 교체하기

Snowyegret 2023. 11. 18. 21:25

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. 결과 확인

게임 실행 시, 영상이 제대로 바뀐 걸 볼 수 있다.