예지의 테크 로그포스 (Yeji's Tech Log Force)
[Web타겟] C# 스크립트가 WebGL을 통해 웹 브라우저에서 실행되는 과정 본문
[Web타겟] C# 스크립트가 WebGL을 통해 웹 브라우저에서 실행되는 과정
Yeji Heo 2024. 8. 22. 16:59SteamGame, GooglePlay에 출시한 LOOP는
PC(Windows, Mac, Linux)플랫폼 / Mobile 플랫폼 / Web Browser 플랫폼을 대상으로 하고있다.
오늘은 그 중에서도 Web Browser 배포를 위해
Web 상에서 그래픽을 렌더링하는 라이브러리 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
'[Unity] Projects & Study > Loop - Interactive Movie' 카테고리의 다른 글
[Web타겟] NCP Object Storage CORS설정(S3 Browser) (3) | 2024.08.27 |
---|---|
[Web타겟] 빌드 용량 줄이기(재설계) (0) | 2024.08.27 |
[Steam 출시] Steampipe 빌드 (+ 잘못된 앱 구성 / 실행파일 누락) (0) | 2023.03.31 |
사용자의 게임 기록 저장&불러오기 - Json파일 저장 (0) | 2023.03.09 |
[Unity] fade out 퀄리티 개선 (0) | 2023.02.05 |