[Unity] Projects & Study/Loop - Interactive Movie

[웹 플랫폼 추가] C# 스크립트가 WebGL을 통해 웹 브라우저에서 실행되는 과정

Yeji Heo 2024. 8. 22. 16:59

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와 비슷한 개념으로, 역시나 플랫폼 독립적이다. 

 

Java는 플랫폼 독립적이다?

Java는 플랫폼 독립적이다 ? 1. 플랫폼이 뭘까? 한마디로 정의하기가 어렵다... 일단 지금은 "서비스를 위한 환경"이라고 생각한다. 배달 플랫폼이면 배달 시스템을 위한 환경, 기차역 플랫폼이면

crayeji.tistory.com

 

 

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