Unity에서 C#으로 작성된 코드는 WebGL 빌드 시 내부적으로 IL2CPP(Intermediate Language to C++)라는 기술을 사용하여 자바스크립트(WebAssembly와 asm.js) 코드로 변환됩니다. 이 과정을 통해 Unity의 C# 코드는 브라우저에서 실행될 수 있는 형태로 컴파일됩니다.
변환 과정
-
C# 코드 컴파일: Unity는 먼저 C# 코드를 중간 언어(MSIL: Microsoft Intermediate Language)로 컴파일합니다.
-
IL2CPP 변환: MSIL 코드가 C++ 코드로 변환됩니다. 이 과정은 Unity의 IL2CPP 기술을 통해 이루어집니다.
-
Emscripten을 사용한 자바스크립트/WebAssembly 변환: 변환된 C++ 코드를 Emscripten 도구를 사용해 asm.js와 WebAssembly로 변환하여 WebGL에서 실행 가능한 자바스크립트 파일과 WASM 파일을 생성합니다.
출력물
WebGL 빌드 결과물은 다음과 같은 파일들로 구성됩니다:
index.html
: 브라우저에서 WebGL 애플리케이션을 실행하는 기본 HTML 파일.
UnityLoader.js
: WebGL 빌드 파일을 로드하고 실행하는 JavaScript 로더.
.wasm
파일: WebAssembly 바이너리 코드로 변환된 Unity 프로젝트.
.data
파일: Unity 애셋 데이터 (텍스처, 오디오 등).
WebGL에서 C# 코드의 JavaScript 변환 예시
Unity C# 코드가 WebGL 빌드 시 자바스크립트에서 어떻게 동작하는지 간단한 예시를 들어 보겠습니다.
C# 코드 예제
using UnityEngine;
public class WebGLExample : MonoBehaviour
{
public void LogMessage()
{
Debug.Log("Hello from Unity C#!");
}
}
WebGL 빌드 후 JavaScript로 변환
WebGL로 빌드하면 Unity의 런타임에서 C# 메서드가 JavaScript로 호출될 수 있습니다. UnityLoader.js
와 WebAssembly 파일 내부에서 메서드가 매핑됩니다.
JavaScript에서 Unity 메서드 호출
Unity는 WebGL용 스크립트에서 제공되는 인터페이스를 통해 Unity 오브젝트에 접근할 수 있습니다. 예를 들어:
// UnityInstance는 Unity 빌드에서 제공하는 객체
const unityInstance = UnityLoader.instantiate("gameContainer", "Build/build.json");
// Unity C# 메서드 호출
function callUnityMethod() {
unityInstance.SendMessage('GameObjectName', 'LogMessage');
}
C# -> JavaScript 통신
Unity C#에서 직접 JavaScript 함수를 호출할 수도 있습니다.
C#에서 JavaScript 호출
Unity는 Application.ExternalCall
또는 Application.ExternalEval
(Deprecated) 대신 JSRuntime.Invoke
를 사용할 수 있습니다.
using UnityEngine;
public class WebGLExample : MonoBehaviour
{
public void CallJavaScriptFunction()
{
Application.ExternalCall("alert", "Hello from Unity!");
}
}
JavaScript에서 C# 호출
Unity WebGL 런타임은 JavaScript에서 Unity 오브젝트의 메서드를 호출할 수 있도록 SendMessage
메서드를 제공합니다.
unityInstance.SendMessage('GameObjectName', 'MethodName', 'optionalArgument');
주요 고려 사항
- 성능: WebGL 빌드는 브라우저에서 실행되므로 C++과 같은 네이티브 플랫폼보다 느릴 수 있습니다. 특히 복잡한 물리 연산이나 대규모 데이터 처리는 성능이 저하될 수 있습니다.
- 제약 사항: WebGL은 파일 시스템과 같은 네이티브 기능을 지원하지 않으며, 네트워크 요청은 동일 출처 정책(CORS)에 의해 제한됩니다.
- 디버깅: WebGL 빌드 후 디버깅은 일반적으로 브라우저의 개발자 도구를 사용하며, IL2CPP로 인해 원본 C# 코드와 직접적인 매핑이 어려울 수 있습니다.
Unity C# 코드는 WebGL 빌드 과정에서 Emscripten과 IL2CPP를 통해 자바스크립트와 WebAssembly 코드로 변환됩니다. 이를 통해 Unity 애플리케이션이 브라우저에서 실행될 수 있으며, WebGL 환경에서 JavaScript와 상호작용할 수 있는 여러 API를 제공합니다.