오르카의 아틀리에

회사에서 신규 슬롯을 제작하고 iOS로 빌드를 한 뒤 해당 게임을 들어갔는데 AssetBundle을 로드하다가 크래시가 나는 상황이 벌어졌다. Console App을 이용해 디바이스 로그를 확인해보니 다음과 같은 메시지가 찍혀있었다.



뒷 문장을 읽어보면, 플레이어 세팅에서 'Strip Engine Code'를 비활성화 시켜봐라 라는데... 일단 Strip Engine Code라는 기능이 무엇인지 몰랐기 때문에 찾아보니 IL2CPP를 사용하면서 iOS에서 빌드 사이즈를 줄이기 위한 기능이었다. (자세한 내용은 여기서 참고)


간단하게 설명하면, 유니티엔진 관련 코드 중 런타임에서는 사용되지 않을 코드들을 제외하고 빌드하는 옵션이다. 만약, 에셋 번들을 이용하여 다이나믹하게 컨텐츠를 다운받게될 경우 게임 빌드에는 포함되어 있지 않지만, 다운로드된 컨텐츠 안에서는 사용되는 친구들이 있을 경우 크래시를 던지게 된다.


해결법은?

해결법은 두가지 정도가 있다.


첫 번째는 로그에 있는 것처럼 'Strip Engine Code'를 비활성화 시키면 된다. Player Setting > iOS 탭에 Optimization 섹션에 위치하고 있다.



하지만, 빌드 파일 사이즈를 줄여주는 고마운 기능을 그냥 꺼버리자니 너무 아까울 수밖에 없다. 두 번째 방법이 귀찮기는 하지만 두 마리의 토끼를 잡을 수 있는 해결 방법이다.


두 번째 방법은 'link.xml'을 작성하는 방법이다. 


위 xml이 작성한 요소들을 어셈블리(DLL)에 포함할 것임을 명시해주는 xml이다. Assets 폴더 안에 작성하면 된다. 문법은 여기을 참조.


문제가 되는 클래스를 어떻게 찾지?

위에 적힌 로그처럼 크래시가 났을 때 해당 ID 값을 같이 뿌려준다. 이 ID는 YAML Class ID Reference에 명시된 클래스들의 ID이다. 위 처럼 64번이면 MeshColider이다.