한글패치 관련 짧은 글

유니티 게임 dll파일 내 대사 수정 (muck)

눈백로 2021. 7. 7. 14:15

예시 게임

:Muck (https://store.steampowered.com/app/1625450/Muck/)

-------

필요 프로그램 / 자료

* dnSpy or ILSpy+Reflexil 둘 중 하나만 받으면 된다.

 

dnSpy(개발 중지): https://github.com/dnSpy/dnSpy/releases

dnSpyEx(후속 툴): https://github.com/dnSpyEx/dnSpy/actions

* dnSpy/dnSpyEx 둘 중 하나만 있어도 된다. 근데 dnSpyEx가 디컴파일이 더 잘 됐었다.

* dnSpyEx를 다운받기 위해선 Github 계정이 있어야 한다.

Github 계정으로 로그인한 후, Actions - 제일 최신 workflow run - dnSpy-net-win64를 누르면 최신 버전이 다운된다.

Releases에 있는 버전은 구버전이니 주의

 

ILSpy 6.2.1 (https://github.com/icsharpcode/ILSpy/releases)

Reflexil 2.5 (https://github.com/sailro/Reflexil/releases)

-------

본문에선 Mono방식의 게임을 다루도록 하겠다.

-------

선 3줄요약

1.  dnSpy 혹은 ilspy+reflexil  다운로드 후 실행

2.  대사 검색 (코드 추출 혹은 직접 검색)

3.  대사 수정 후 패치된 dll파일 저장/교체

-------

 

게임에서 나오는 (Press "E" to pickup 부분이 monobehaviour 파일을 통한 수정으로도 변화가 없었다.

그러므로 dll 파일을 뜯어보도록 하자.

1번(Dnspy) 혹은 2번(ILSpy)과 중 하나를 선택하자. Dnspy를 추천한다.

 

 

1. Dnspy를 이용하여 검색 및 수정하기

기본적으로 dnSpy에서 직접 검색할 수 있고,

전체적인 검색이 필요하다면 소스코드로 내보내서 타사 툴을 이용해 검색할 수 있다.

두가지 다 설명하겠다.

따라서, 검색부분과 수정부분을 점선으로 분리하였다.

 

----------------------------------------------------------------------------

1-1. dnSpy 자체적으로 텍스트 검색하는 법

{게임이름}_Data\Managed 폴더에 찾아가 보면 Assembly-CSharp.dll이 있을 것이다.

이 파일을 dnSpy에 로드시킨 후,

상단 메뉴 Edit - Search Assemblies를 클릭하면 좌측 하단 "Search"창이 뜬다.

우측 하단 Search For: 오른쪽 박스를 "All"에서 "Number/String"으로, "All Files"를 "Selected Files"를 누른다.
그럼 우리가 불러온 "Assembly-CSharp.dll" 파일 안에 있는 Number/String만 검색된다.

 

정상적으로 검색된 것이 보인다.

 

 

 

1-2. 소스코드를 내보낸 후, 텍스트 에디터로 검색해서 수정하기

File - Export to Project를 누른다.

소스코드로 내보내는 이유는 "파일에서 찾기" 기능을 이용하기 위함이다.

이 과정이 필요없고, dnSpy에서 직접 찾고 싶다면 아래 내용을 건너뛰면 된다.

 

 

Folder는 걍 아무 곳에나 하나 만든 후 지정해주고, Export를 누르자.

 

 

Notepad++의 "파일에서 찾기(Ctrl+Shift+F)" 기능을 사용하여

아까 Export한 폴더에서 파일검색을 하면 바로 튀어나온다. "PickupInteract.cs" 파일에 있댄다.

 

 

Assembly-CSharp.dll 트리를 열어 내려가다 보면,

"-" 안에 "PickupInteract" 클래스가 있는 것을 볼 수 있다.

 

 

오른쪽 창을 보면 우리가 찾던 대사가 보인다.

 

----------------------------------------------------------------------------

 

 

* dnSpy에서 수정하기

검색은 위 두가지 방법이 있으니 알아서 편한 방법대로 하고,

이제 수정을 해보자. 수정도 "Edit Method", "Edit IL" 두가지 방법을 주로 사용한다.

 

 

대사 부분을 우클릭하여 일단 "Edit Method (C#)..."를 눌러보자.

 

 

수정할 수 있는 창이 뜬다.

원하는 대로 수정하고 아래 "Compile"을 누르자.

에러가 떴다면 후술할 "Edit IL Instructions" 메뉴 이용하는 법을 참고하자.

 

 

제대로 변경되었는지 확인하고, Save All을 누르면 dll 변경점이 저장된다.

이후 실행해서 확인해보자.

 

----

 

* "Edit IL Instruction..." 메뉴 이용하기

위에서 대사부분을 우클릭하면 떴던 메뉴 중 "Edit IL Instruction..."이라는 메뉴가 있다.

 

보통 이렇게 생겼다.

대사가 그대로 들어있기에 참 고마운 경우이다.

보통 숫자 부분을 에딧하려면 16진수로 써져있고,

단순 텍스트가 아닌 좀 복잡한 수정을 하기 위해선 IL을 알아야 하므로 주의할 필요가 있다.

아무튼 Edit Method로 수정이 안 될 경우 Edit IL을 이용하여 수정할 수 있다.

수정 후 OK - Save all - 인겡미 출력 확인 과정을 거치면 된다.

 

 

2. ILSpy + Reflexil을 이용하여 수정하기

reflexil.for.ILSpy.2.5.AIO.bin.zip과 ILSpy_binaries_6.2.1.6137.zip를 다운받아서 한 폴더에 압축을 푼다.

ILSpy.exe를 실행한다.

 

 

 

File -> Open -> 한글화하고자 하는 게임 폴더 -> {이름}_data -> Managed를 들어가서

Assembly-CSharp.dll을 선택한다.

 

불러온 다음, Save Code를 눌러 폴더에 원본 소스들을 저장한다. 이는 검색을 편하게 하기 위해서다.

다른 dll파일의 경우, 이름만 바꿔서 생각하면 된다.

 

 

 

검색을 편리하게 하기 위해 Notepad++를 실행 후

찾기-> 파일에서 찾기 -> 아까 세이브한 폴더 지정 후 to pickup을 검색한다.

 

 

 

pickupinteract.cs 파일에 대사가 있다고 한다.

ilspy로 - 라고 쓰여져 있는 부분을 열어보면, 뭐가 엄청 나오는데 쭉 내리다 보면 PickupInteract라는 항목이 보인다.

 

 

 

ilspy 상단 View -> Reflexil v2.5를 클릭하면 프로그램 하단부에 Reflexil이 뜨게 된다.

변경하고자 하는 부분을 클릭 후 우클릭하면 Edit... 메뉴가 뜨는데, 누른 다음 수정을 하고 update를 누른다.

이후 제대로 변경되었는지 확인한다.

 

 

 

다시 좌측 트리 제일 윗부분으로 스크롤을 올린 다음, Assembly-CSharp을 우클릭한 후 Save as...를 누른다.

원본 파일을 백업하고, Assembly-CSharp.Patched.dll를 Assembly-CSharp.dll으로 바꾼 후 게임을 실행해 보자.

 

 

 

지금 보니까 뒤에 큰따옴표를 잘못 썼는데, 어쨌건 한글화가 완료되었다.

나머지도 비슷한 방식으로 처리할 수 있다.