# Unity C# 스크립트에서 JavaScript 함수 호출

> Call functions from your JavaScript plug-in or browser in your Unity project.

Unity C# 코드에서 JavaScript 플러그인의 함수를 사용할 수 있습니다. 웹 페이지 또는 웹 API의 다른 요소와 통신해야 할 수 있으므로 Unity에서 JavaScript 코드를 사용하는 것이 유용할 수 있습니다.

파일 유형과 Unity 스크립트와 상호 작용하기 위해 JavaScript 플러그인을 설정하는 방법에 대해 알아보려면 [JavaScript 플러그인 설정](/engine/6000.0/manual/platform-specific/webgl/develop/interactingwithbrowserscripting/web-interacting-browser-js.md)을 참조하십시오. C/C++/C# 플러그인과 상호 작용하는 방법을 알아보려면 [Unity C# 스크립트에서 C/C++/C# 함수 호출](/engine/6000.0/manual/platform-specific/webgl/develop/interactingwithbrowserscripting/web-interacting-browsers-c-to-unity.md)을 참조하십시오.

| 항목                                                        | 설명                                               |
| --------------------------------------------------------- | ------------------------------------------------ |
| [JavaScript에서 Unity로 다른 변수 전달](#pass-different-variables) | Unity와 JavaScript 간에 다른 변수를 전달하는 방법에 대한 팁입니다.    |
| [자체 범위에서 빌드 코드 실행](#make-code-visible)                    | Unity와 JavaScript 간의 코드 가시성을 개선하는 방법에 대한 팁입니다.   |
| [JavaScript 함수를 호출하는 Unity C# 코드 예시](#example-unity-code) | 이 예시 코드는 Unity에서 JavaScript 함수를 호출하는 방법을 보여 줍니다. |
| [Unity 플러그인을 레퍼런스로 사용](#plugin-ref)                       | 레퍼런스로 사용할 수 있는 Unity에 포함된 플러그인의 목록을 표시합니다.       |

## JavaScript에서 Unity로 다른 변수 전달##pass-different-variables-from-javascript-to-unity

JavaScript를 Unity와 연동하려면 둘 사이에 효율적인 통신이 필요합니다. JavaScript에서 Unity로 다양한 데이터 유형을 전달하는 방법에 대한 다음 팁을 참조하십시오.

### 숫자 유형##numeric-types

간단한 숫자 유형을 전환하지 않고 함수 파라미터의 JavaScript로 전달할 수 있습니다.

예를 들어 이러한 JavaScript 함수는 다음과 같습니다.

```js
AddNumbers: function (x, y) {
    return x + y;
  },
```

전환 없이 C#의 정수 값을 허용합니다.

```cs
int result = AddNumbers(5, 7);
```

Emscripten 힙에서 다른 데이터 유형을 포인터로 전달할 수 있습니다. Emscripten 힙은 JavaScript 메모리의 큰 배열에 불과합니다.

### 문자열##strings

문자열을 JavaScript 문자열로 전환하려면 `UTF8ToString` 헬퍼 함수를 사용합니다.

```js
var stringMessage = UTF8ToString("Hello World");
```

문자열 값을 반환하려면 `_malloc`를 호출하여 일부 메모리를 할당하고 `stringToUTF8` 헬퍼 함수를 호출하여 메모리에 JavaScript 문자열을 작성합니다. 문자열이 반환 값인 경우 IL2CPP 런타임이 자동으로 메모리를 확보합니다.

```js
 var returnStr = "Hello World";
    var bufferSize = lengthBytesUTF8(returnStr) + 1;
    var buffer = _malloc(bufferSize);
    stringToUTF8(returnStr, buffer, bufferSize);
```

### 배열##arrays

프리미티브 유형 배열의 경우 Emscripten은 다음과 같은 여러 정수 크기, 부호 없는 정수 또는 부동 소수점 메모리 표현에 각기 다른 `ArrayBufferViews`를 힙에 제공합니다. `HEAP8`, `HEAPU8`, `HEAP16`, `HEAPU16`, `HEAP32`, `HEAPU32`, `HEAPF32`, `HEAPF64`.

다음 함수는 `HEAPF32` 배열을 반복하여 각 인덱스의 값을 출력합니다.

```js
PrintFloatArray: function (array, size) {
    for(var i = 0; i < size; i++)
    console.log(HEAPF32[(array >> 2) + i]);
  },
```

### 텍스처##textures

WebGL에서 텍스처에 액세스하기 위해 Emscripten은 Unity에서 WebGL 텍스처 오브젝트로 네이티브 텍스처 ID를 매핑하는 `GL.textures` 배열을 제공합니다. Emscripten의 WebGL 컨텍스트인 `GLctx`에서 WebGL 함수를 호출할 수 있습니다.

예를 들어 다음 함수는 GL 텍스처 배열의 WebGL 텍스처를 2D 텍스처에 바인딩합니다.

```js
 BindWebGLTexture: function (texture) {
    GLctx.bindTexture(GLctx.TEXTURE_2D, GL.textures[texture]);
  },
```

## 자체 범위에서 빌드 코드 실행##execute-build-code-in-its-own-scope

모든 빌드 코드를 자체 범위에서 실행하는 것이 좋습니다. 자체 범위에 코드가 있는 경우 내장된 페이지 코드와 충돌하지 않고 콘텐츠를 페이지에 내장할 수 있으며, 동일한 페이지에 두 개 이상의 빌드를 내장할 수 있습니다.

### .jslib 플러그인의 코드##code-in-.jslib-plug-ins

프로젝트에 모든 JavaScript 코드가 `.jslib` 플러그인 형태로 있는 경우 이 JavaScript 코드는 컴파일된 빌드와 동일한 범위 내에서 실행되며 코드는 이전 Unity 버전과 동일한 방식으로 작동합니다. JavaScript 플러그인 코드에서 직접 볼 수 있는 일부 오브젝트 및 함수는 다음과 같습니다.

* `Module`
* `SendMessage`
* `HEAP8`
* `ccall`

### 전역 범위에서 JavaScript 함수 호출##call-javascript-functions-from-global-scope

내부 JavaScript 함수를 내장된 페이지의 전역 범위에서 호출하려면 웹 템플릿 `index.html`에서 `unityInstance` 변수를 사용해야 합니다.

Unity 엔진 인스턴스화가 성공한 후 다음과 같이 `unityInstance`를 사용합니다.

```js
  var MyGameInstance = null;
  script.onload = () => {
    createUnityInstance(canvas, config, (progress) => { /*...*/ }).then((unityInstance) => {
      MyGameInstance = unityInstance;
```

그런 다음 `MyGameInstance.SendMessage()`를 사용하여 빌드에 메시지를 보내거나 `MyGameInstance.Module`을 사용하여 빌드 모듈 오브젝트에 액세스할 수 있습니다.

## JavaScript 함수를 호출하는 Unity C# 코드 예시##example-unity-c-code-that-calls-javascript-functions

다음 JavaScript 코드는 `Hello`라는 이름의 함수를 생성합니다. 이 예시에서는 Unity C# 스크립트에서 호출할 수 있도록 JavaScript 플러그인에서 이 코드를 사용합니다.

```js
mergeInto(LibraryManager.library, {

  Hello: function () {
	window.alert("Hello, world!");
  },
});
```

그런 다음 Unity 프로젝트에서 다음 C# 코드를 사용하여 JavaScript 코드에서 `Hello` 함수를 호출합니다.

```cs
using UnityEngine;
using System.Runtime.InteropServices;

public class NewBehaviourScript : MonoBehaviour {

    [DllImport("__Internal")]
    private static extern void Hello();

    void Start() {
        Hello();
    }
}
```

다양한 함수 유형이 포함된 더 큰 코드 예시는 [코드 예시: Unity에서 JavaScript 및 C/C++/C# 함수 호출](/engine/6000.0/manual/platform-specific/webgl/develop/interactingwithbrowserscripting/web-interacting-code-example.md)을 참조하십시오.

## Unity 플러그인을 레퍼런스로 사용##use-unity-plug-ins-as-a-reference

Unity 설치 폴더에는 다음과 같이 레퍼런스로 사용할 수 있는 플러그인이 몇 개 있습니다.

* `PlaybackEngines/WebGLSupport/BuildTools/lib`

* `PlaybackEngines/WebGLSupport/BuildTools/Emscripten/src/library*`

## 추가 리소스##additional-resources

* [브라우저 스크립팅과 상호 작용](/engine/6000.0/manual/platform-specific/webgl/develop/interactingwithbrowserscripting.md)

* [JavaScript 플러그인 설정](/engine/6000.0/manual/platform-specific/webgl/develop/interactingwithbrowserscripting/web-interacting-browser-js.md)

* [JavaScript에서 Unity C# 스크립트 함수 호출](/engine/6000.0/manual/platform-specific/webgl/develop/interactingwithbrowserscripting/web-interacting-browser-unity-to-js.md)

* [Unity C# 스크립트에서 C/C++/C# 함수 호출](/engine/6000.0/manual/platform-specific/webgl/develop/interactingwithbrowserscripting/web-interacting-browsers-c-to-unity.md)

* [Unity C#, JavaScript, C/C++/C# 코드 간 콜백 생성](/engine/6000.0/manual/platform-specific/webgl/develop/interactingwithbrowserscripting/web-interacting-browser-example.md)
