texture 를 실시간으로 바꿔주는 BepInEx plugin 입니다.
기능은
aHR0cHM6Ly93b3JrdXBsb2FkLmNvbS9maWxlL1F4cFRFc2RXTktk
이전 버전에서는 MD5를 사용했으나 crc32로 대체되었습니다. 따라서 기존에 사용하던 MD5는 사용할 수 없으니 crc32로 update 해 주세요. 굳이 MD5를 쓰시겠다면 구버전 플러긴을 사용하세요.
기존엔 hash(MD5나 crc32)를 사용하지 않는 파일명에 "_"를 끝에 넣었지만, 이젠 원본 파일명 그대로를 사용합니다. 기존에 사용했던 파일들의 이름을 전부 바꾸는 것이 좀 귀찮으므로, powerShell 실행해서 ModImages 폴더에서
Get-ChildItem -Recurse -Filter *.png | Where-Object { $_.BaseName -match '.*_$' } | ForEach-Object {
$newBaseName = $_.BaseName -replace '_+$'
Rename-Item -LiteralPath $_.FullName -NewName "$newBaseName$($_.Extension)"
}
하시면 됩니다.
게임 속도를 안 떨어뜨리기 위해 온갖 삽질을 했습니다.
일부 게임에서 덤프뜨면 색이 어두워지는 증상을 수정했습니다.
crc32를 지우는 스크립트.
Get-ChildItem -Path . -Recurse -File | Where-Object { $_.Name -match '^(.+)_[0-9a-fA-F]{8}\.png$' } | ForEach-Object { Write-Host "변경: $($_.Name) → $($matches[1]).png"; Rename-Item -LiteralPath $_.FullName -NewName "$($matches[1]).png" }
여기부터는 잡담입니다. 웬만하면 읽지마세요.
거의 한달동안 제미나이를 갈구면서 만들었습니다.
기존에 처리하는 방식은 주기적으로 Resources.FindObjectsOfTypeAll() 으로 Texture2D 를 구해서 조지는 방식이였습니다. 그래서 저 구하는 순간이 랙이 생기는 포인트였습니다. 그래서 바꿀 대상을 어떻게하면 천천히 구할까.. 머릴 굴려봤지만 어차피 저 방법말고는 scene을 scan(GameObject를 하나씩 뒤지기)밖에 없었습니다.
GameObject 를 단위로 처리하는 방식으로 바꾸면서 소스가 2천 줄 정도였던 소스가 5천 줄이 되었습니다. Texture2D만 구해서 바꾸는 방식은 심플하고 문제가 발생할 일도 별로 없었는데, GameObject는 UI.Image, UI.RawImage, SpriteRenderer, ... 각 케이스별로 다 처리를 다르게 해줘야 합니다.
이렇게 처리하다보니 예전에 신경쓰이던 것이 해결되긴 했네요. jsk게임들의 로고를 고쳐서 replace하면 글자가 일부 잘렸는데, 이것이 해결되었습니다. sprite에 mask가 걸린 경우인데, sprite를 새로 생성해서 replace하면 된다고 하는군요.
'유니티버전에 관계없이 작동'이라는 기능은 온갖 노가다를 유발합니다. 간단한 예를 든다면 UnityEngine.UI 라는 것은 구버전에서는 UnityEngine.dll 에 있었는데 나중에 UnityEngine.UI.dll 로 분리되었습니다. 소스에 사용할 라이브러리 파일을 지정합니다. 그러면 실제 게임에서 로드될 때는 라이브러리 위치가 달라서 에러가 발생하고 사용 못하게 됩니다. 이것을 해결할 방법이 있었으니. 바로 '리플렉션(reflection)'. 라이브러리를 직접 절하는 것이 아닌 이름으로 찾아보고 있으면 그걸 사용하는 방식인데.. 소스가 개판이 되죠..
디버그 콘솔로 보시면 온갖 경고가 줄줄이 나오는 것을 볼 수 있습니다. 소스에 경고도 100개가 넘는데, 이것도 고칠 수가 없네요..
어쨋든 올해가 가기전에(?) 완료했으니 다행이네요.
남은 문제점이 있는데.. 애니메이션입니다. 애니메이션은 보통 메모리에 이미지들 올려놓고 바꿔치기만 하면서 보여주는 거라서, scene scan에서는 보여진 그 이미지만 하나 바꿔지겠지요. 여섯장의 이미지로 된 애니메이션이 있다면 그 여섯장이 화면에 각각 보이고 그것을 scan 했을 때 replace가 되니까.. 다 바꾸는 것은 되긴 되는데 아주 오래걸리겠지요. (예. SUMMER ~夏の14日~)
