0. 요약

유니티 엔진의 dll을 수정해서 미리보기가 안 나오는 버그를 우회함. 

 

1. 버그 현상

Unity 2020 LTS 최신버전에서 Sprite 선택창의 검색 결과에서 이미지 미리보기가 나오지 않는 버그가 있음

Unity 2020 LTS bug

 

(ba1 이나 00을 입력하는 순간, 미리보기가 사라지고 리스트만 남게 됨)

 

처음에는 미리보기가 잘 나오고, 검색어를 입력하다보면 발생함 

 

2. 유니티 코드를 뜯어보자 

 

ObjectSelect.cs SearchArea()

미리보기가 표기되는 부분의 코드를 추적하니, 

Unity Editor에서 최종적으로 표기가 달라지는 위치는 이 코드임을 확인할 수 있었음 

 

ObjectListArea.cs CanShowThumbnails()

CanShowThumbnail() 는 변수 m_AllowThumbnails 의 wrapper에 불과하고,

해당 변수는 Usage가 4군데 있어서 하나씩 추적을 해봄

ObjectListArea.cs m_AllowThumbnails

 

checkThumbnails 라는 flag는 매우 여러 부분에서 중첩으로 변경이 되어, 추적이 어렵고 

ObjectsHaveThumbnails() 이라는 이름이 찾으려고 하던 부분이 맞는 것 같음 

ObjectListArea.cs ObjectsHaveThumbnails()

HasBuiltinResources 가 있는 경우 return true가 된다? 

 

checkmark(builtin resource) preview

checkmark 라는 에셋은  유니티 내장 sprite로, unity_builtin_extra 라는 속성을 갖고 있고, 

검색결과에 해당 에셋이 포함된 경우에는 항상 미리보기가 정상적으로 나옴을 확인할 수 있었음

검색 결과에 따라 미리보기가 동작하기도하고, 나오지 않기도 하던 원인을 알아냄. 

 

 

그렇다면 ObjectsHaveThumbnails()가 어떻게 달라져서,

2019에서는 되고 2020에서는 버그가 발생한 것일까?

https://github.com/Unity-Technologies/UnityCsReference/blob/23b613cc7ab4e7837ca7db09aa8db2ed8ee13a72/Editor/Mono/ObjectListArea.cs

github에서 해당 부분의 2019 버전 코드를 찾아보았는데, 

decompiler 에 의해서 코드가 조금 달라지긴 했지만, 해당부분의 코드가 바뀌진 않았음. 

 

ObjectListArea.cs ObjectsHaveThumbnails() in Unity 2019

 

그럼 sprite만 있는 경우, IHierarchyProperty  부분에서 문제가 생겨서 return true를 못해주고 있다는 것인데, 

에디터 내부 코드에 브레이크 포인트를 찍어볼 수 없어서 해당 코드들이 쉽게 파악이 되질 않음. 

 

 

2. 문제 해결 

대략적인 상황 파악을 했는데, 설정이나 옵션의 문제가 아니므로 

엔진 코드를 고치지 않고서는 문제 해결이 어렵겠다는 판단이 들었음 

 

엔진 코드를 어떻게 고치지 ...  지구인들아 도와줘 ! 

 

그런 걸 왜 하죠.jpg

 

남은 것은 구글 뿐인가...

구글링을 통해서 dnSpy 라는 툴로 dll을 unpack/pack 할 수 있다는 것을 알게 됨 

 

dnSpy context menu

edit Method (C#), edit class (C#)이라니 너무 멋지다.  

 

누구나 그럴싸한 계획을 가지고 있지.jpg

edit method C# 기능이 있어서 코드로 바로 수정을 할 수는 있는데,

의존성이 난리가 나서 컴파일이 안 됨 

옵션에서 dll 같은걸 넣어주면 될 것 같은데 어디서 어떻게 하는지 몰라서 

그냥 여기까지 온거 IL Instructions 을 고치면 되지. 정면 승부다!

 

 

라이더의 ILView 를 사용하여 return false가 ldc.i4.0 같은 IL로 이루어져있음을 확인함. 

Rider 만세 !!!

 

 

https://docs.microsoft.com/ko-kr/dotnet/api/system.reflection.emit.opcodes.ldc_i4_1?view=net-5.0

ldc_i4_1 에 대한 IL 설명을 보면 '정수 값 1을 int32로 계산 스택에 푸시합니다.' 가 한글이라는게 믿기 힘들 정도로 독해가 잘 안되지만 

ldc_i4_0은 return 0 이고 ldc_i4_1 은 return 1인것 같음 

 

dll을 이렇게 고치고 파일을 덮어쓰고 저장이 잘 되었다.

 

참고로 

2020.3.8f1\Editor\Data\Managed\UnityEditor.dll 은 페이크고 

2020.3.8f1\Editor\Data\Managed\UnityEngine\UnityEditor.core.dll 이 진짜임 

(UnityEditor.dll 을 수정했더니 문제 해결이 안되서, 

여기까지 왔는데 왜 안 고쳐지는지 모르겠어서 멘탈이 나가서 울고 싶었다.)

 

 

3. 엔딩

미리보기가 잘 동작하게 된다 

 

 

'01_Note' 카테고리의 다른 글

Windows 에서 PHP 실행하기  (0) 2017.10.02
Redis  (0) 2013.12.31
APMSETUP PHP version upgrade  (1) 2013.05.05

+ Recent posts