# 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

JavaScript 코드에서 C, C++ 또는 C# 콜백을 호출하려면 `makeDynCall`을 사용합니다. 예를 들어 다음 JavaScript 코드는 함수 ‘callback’을 호출합니다.

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

* `'vii'`는 파라미터의 서명입니다. 예를 들어 콜백 함수는 `void` 유형(v)이고, `(1,2)`는 둘 다 정수(ii)입니다.
* `'callback'`은 콜백 함수의 이름입니다.
* `(1, 2)`는 함수에 전달되는 인자입니다.

다음은 ‘onresponse’ 함수를 사용하여 콜백을 수행하고 플로트(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)

* [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)

* [지원이 중단된 브라우저 상호 작용 코드 교체](/engine/6000.0/manual/platform-specific/webgl/develop/interactingwithbrowserscripting/web-interacting-browser-deprecated.md)
