# Unity C# スクリプトから JavaScript 関数を呼び出す

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

JavaScript プラグインの関数を Unity C# コードで使用できます。ウェブページの他の要素や Web 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` を呼び出し、JavaScript 文字列をメモリに書き込むために `stringToUTF8` ヘルパー関数を呼び出します。文字列が戻り値の場合は、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 は `GL.textures` 配列を提供し Unity から WebGL テクスチャオブジェクトへネイティブのテクスチャ ID をマップします。WebGL 関数は、Emscripten の WebGL コンテキスト `GLctx` で呼び出すことができます。

例えば、以下の関数は WebGL テクスチャを GL テクスチャ配列から 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` という名前の関数を作成します。この例では、このコードを JavaScript プラグインで使用して、Unity C# スクリプトで呼び出せるようにします。

```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)

* [Unity C# スクリプト関数を JavaScript から呼び出す](/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)
