Version: Unity 6.0 (6000.0)
언어 : 한국어
정적 라이브러리를 Unity 플러그인으로 컴파일
Unity Web 빌드의 JavaScript 인터페이스

Unity C#, JavaScript 및 C/C++/C# 코드 간에 콜백 생성

콜백은 Unity 프로젝트가 JavaScript 브라우저, JavaScript 플러그인, C/C++/C# 플러그인과 더 나은 통신을 할 수 있으므로 웹 개발의 중요한 부분입니다. Unity C# 코드에서 C/C++/C# 또는 JavaScript 코드로 함수를 호출할 수 있으며, 콜백은 이 경우 효과적인 방법입니다.

makeDynCall 함수를 사용하여 콜백 만들기

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

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

다음은 ‘onresponse’ 함수를 사용하여 콜백을 수행하고 플로트(f)와 여러 정수 유형 값을 전달하는 코드의 또 다른 예시입니다.

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

스크립트에서 콜백 사용

다음 스크립트는 콜백 함수를 사용하여 JavaScript, C++ 및 C# 코드 간에 통신하는 방법의 예를 보여 줍니다.

JavaScript 플러그인 코드

다음은 타임아웃을 예약하고 콜백을 호출하는 .jslib 파일의 예시 코드입니다.

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++ 파일의 예시입니다. * 외부 JavaScript 함수 호출(JsSetTimeout) * 타임아웃이 발생할 때 JavaScript가 호출하는 콜백 함수를 포함


// 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# 코드

다음 코드는 C++ 및 JavaScript 콜백에서 메시지를 수신하는 C# Unity 코드의 예시입니다.

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}\"");
    }
}

추가 리소스

정적 라이브러리를 Unity 플러그인으로 컴파일
Unity Web 빌드의 JavaScript 인터페이스