# Unity C#、JavaScript、C/C++/C# コード間のコールバックの作成

> Learn how to use callbacks to communicate between your plug-in, browser, and Unity project.

コールバックはウェブ開発の重要な部分です。コールバックを使用することで、Unity プロジェクトと JavaScript ブラウザー、JavaScript プラグイン、および C/C++/C# プラグインとの通信が向上するためです。Unity C# コード内で C/C++/C# コードまたは JavaScript コードから関数を呼び出したい場合があります。コールバックは、これを行うための効果的な方法です。

## makeDynCall 関数を使用してコールバックを作成する##use-the-makedyncall-function-to-make-callbacks

`makeDynCall` を使用して、JavaScript コードから C、C++、または C# コールバックを呼び出します。例えば、以下の JavaScript コードは関数 "callback" を呼び出します。

```js
{{{ makeDynCall('vii', 'callback') }}}(1, 2)
```

* `'vii'` は、パラメーターのシグネチャです。例えば、コールバック関数は `void` 型 (v) で、`(1,2)` は両方とも整数 (ii) です。
* `'callback'` はコールバック関数の名前です。
* `(1, 2)` は、関数に渡す引数です。

以下のコードは、関数 "onresponse" でコールバックを行い、Float (f) 型と複数の整数型の値を渡すコードの別の例です。

```js
{{{ makeDynCall('vfii', 'onresponse') }}}(2.8, arg, 0);
```

## スクリプトでのコールバックの使用##use-callbacks-in-your-scripts

以下のスクリプトは、コールバック関数を使用して JavaScript、C++、C# コード間で通信する方法の例を示しています。

### JavaScript プラグインコード##javascript-plug-in-code

以下のコードは、タイムアウトをスケジュールし、コールバックを実行する `.jslib` ファイルの例です。

```js
mergeInto(LibraryManager.library, {
    JsSetTimeout: function (message, timeout, callback) {
        // Create copy of message because it might be deleted before callback is run
        var stringMessage = UTF8ToString(message);
        var buffer = stringToNewUTF8(stringMessage);
        setTimeout(function () {
            {{{ makeDynCall('vi', 'callback') }}} (buffer);
            _free(buffer);
        }, timeout);
    }
});
```

### C++ プラグインコード##c++-plug-in-code

以下のコードは、以下の特徴を持つ C++ ファイルの例です。

* 外部 JavaScript 関数 (`JsSetTimeout`) を呼び出します。
* タイムアウトが発生したときに JavaScript が呼び出すコールバック関数が含まれています。

```cpp

// CallbackExample.cpp
#include <stdio.h>

typedef void (*OnTimeOutCallback)(char* message);

extern "C"
{
    void JsSetTimeout(char* message, int timeout, OnTimeOutCallback callback);
}

void CCallback(char* message)
{
    printf("C callback received \"%s\"\n", message);
}

extern "C" void SetCTimeout()
{
    JsSetTimeout("Hello World", 1000, CCallback);
}
```

### Unity C# コード##unity-c-code

以下のコードは、C++ および JavaScript コールバックからメッセージを受信する C# Unity コードの例です。

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

public class CallbackExample : MonoBehaviour
{
    void Awake()
    {
        SetCSharpTimeout();
        SetCTimeout();
    }

    void SetCSharpTimeout()
    {
        JsSetTimeout("Hello World", 500, CSSharpCallback);
    }

    [DllImport("__Internal")]
    public static extern void SetCTimeout();    
    
    [DllImport("__Internal")]
    public static extern void JsSetTimeout(string message, int timeout, Action<string> action);

    [MonoPInvokeCallback(typeof(Action<string>))]
    public static void CSSharpCallback(string message)
    {
       Debug.Log($"C# callback received \"{message}\"");
    }
}
```

## 追加リソース##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-js-to-unity.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)

* [非推奨ブラウザーインタラクションコードの置き換え](/engine/6000.0/manual/platform-specific/webgl/develop/interactingwithbrowserscripting/web-interacting-browser-deprecated.md)
