유니티는 C# 언어로 개발하는데, 다양한 디바이스 및 WebGL 자바스크립트 언어로 동작하게 되나요?

1 답변

0 투표

Unity에서 C#으로 작성된 코드는 WebGL 빌드 시 내부적으로 IL2CPP(Intermediate Language to C++)라는 기술을 사용하여 자바스크립트(WebAssembly와 asm.js) 코드로 변환됩니다. 이 과정을 통해 Unity의 C# 코드는 브라우저에서 실행될 수 있는 형태로 컴파일됩니다.

변환 과정

  1. C# 코드 컴파일: Unity는 먼저 C# 코드를 중간 언어(MSIL: Microsoft Intermediate Language)로 컴파일합니다.

  2. IL2CPP 변환: MSIL 코드가 C++ 코드로 변환됩니다. 이 과정은 Unity의 IL2CPP 기술을 통해 이루어집니다.

  3. 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를 제공합니다.

add
...