[웹 플랫폼 추가] C# 스크립트가 WebGL을 통해 웹 브라우저에서 실행되는 과정
SteamGame, GooglePlay에 출시한 LOOP는 PC(Windows, Mac, Linux)플랫폼과 Android 플랫폼을 대상으로 하고있다.
NAVER Cloud Camp에서 웹 데브옵스에 대한 이해를 쌓으면서,
이번에는 LOOP를 웹 플랫폼으로도 배포 해보고 싶다는 생각이 들었다. 그래서 WebGL을 알아본다.
기존 콘텐츠를 WebGL로 제공하려면?
Unity에서 Build Settings를 들여다보면 콘텐츠를 빌드하는 방법은 아래와 같이 다양했다.
콘텐츠를 웹 브라우저로 실행하려면 WebGL 빌드 및 실행이 필요하다.
기본적으로 WebGL에서 코드를 실행하려면 이들이 모두 JavaScript여야 한다.
그런데 나는 이미 .NET C#스크립트로 게임 코드를 작성해 출시하였다. 이를 JavaScript로 변환할때에는 IL2CPP를 사용한다고 한다.
IL2CPP는 이름에서 알 수 있듯이, 빌드한 코드를 C++로 변환하는 중간 언어다.
기존에는 Mono를 통해서 MS제품군이 아닌 플랫폼에서도 .C#을 실행시키곤 했다.
C#으로 작성한 코드를 컴파일해서 IL코드를 만들고, Mono가 IL(.Net ByteCode)을 런타임에 기계어로 컴파일 하곤 했다. (JIT-Compile방식)
* 참고: IL(.NET ByteCode)은 Java의 ByteCode와 비슷한 개념으로, 역시나 플랫폼 독립적이다.
IL2CPP는 IL코드를 C++로 변환하고, 플랫폼에 따라(Windows면 exe, Android면 apk 등..)적절한 Native Binary file을 만든다. 즉, 나는 WebGL을 플랫폼으로서 선택했으므로 C++소스 파일을 JavaScript로 변환하게 될 것이다.
이 때 C++를 JavaScript로 바꾸기 위해 Emscripten컴파일러를 사용한다.
Emscripten은 그냥 JavaScript로만 바꾸는 게 아니라 Asm.js라는 좀 더 빠른 JavaScript Subset을 만든다.
Asm.js코드는 AOT-Compile (Ahead-Of-Time compile) 할 수 있다.
* 참고: 앞서 IL은 JIT-Compile이라고 했는데, JIT는 런타임에 ByteCode를 기계어로 바꾸고, AOT는 실행 전에 바꾸기 때문에 실행시에는 더 빠르다. 반대로 생각하면 실행 전에 모든 작업을 마쳐야 하니 빌드 속도는 느리다. 그래서 개발 할 때는 JIT로(Unity 에디터에서), 배포할때는 AOT로(Target Platform에서) 컴파일하도록 설계하면 좋겠다. (물론 JIT-Compile라도 인터프리터보다는 빠르다.)
결론
IL2CPP를 통해 C#을 JavaScript로 변환하면 WebGL 빌드 및 실행이 가능해진다.
이를 통해 Unity콘텐츠의 웹 제공이 가능해진다.
참고자료
https://docs.unity3d.com/kr/2018.4/Manual/webgl-gettingstarted.html