Unity WebGL에서 JavaScript와 상호작용하기
이 문서는 Unity를 사용하여 WebGL 빌드에서 JavaScript와 상호작용하는 방법에 대한 공식 가이드를 다룹니다. 게임을 웹에 배포할 때, 웹 페이지의 다른 요소와의 상호작용이나 JavaScript API를 호출하고 싶을 때 유용한 내용을 포함하고 있습니다.
왜 JavaScript와 상호작용해야 할까요?
Unity WebGL 빌드를 통해 웹에 콘텐츠를 배포할 경우, JavaScript와 상호작용해야 하는 여러 상황이 생길 수 있습니다. JavaScript는 웹 페이지의 구성 요소와 상호작용하며, 이는 게임이나 앱의 기능을 확장하는 데 도움을 줍니다.
JavaScript 호출하는 방법
Unity WebGL에서 JavaScript 함수를 호출하는 기본적인 방법은 .jslib
파일을 만들어서 적용하는 것입니다. 이 파일은 Unity의 Assets 폴더 내의 "Plugins" 하위 폴더에 저장됩니다.
JavaScript 코드 예시
다음은 JavaScript에서 정의할 수 있는 여러 함수의 예입니다:
mergeInto(LibraryManager.library, {
Hello: function () {
window.alert("Hello, world!");
},
HelloString: function (str) {
window.alert(UTF8ToString(str));
},
PrintFloatArray: function (array, size) {
for(var i = 0; i < size; i++)
console.log(HEAPF32[(array >> 2) + i]);
},
AddNumbers: function (x, y) {
return x + y;
},
StringReturnValueFunction: function () {
var returnStr = "bla";
var bufferSize = lengthBytesUTF8(returnStr) + 1;
var buffer = _malloc(bufferSize);
stringToUTF8(returnStr, buffer, bufferSize);
return buffer;
},
BindWebGLTexture: function (texture) {
GLctx.bindTexture(GLctx.TEXTURE_2D, GL.textures[texture]);
},
});
C#에서 JavaScript 함수 호출
이제 C# 스크립트에서 위에서 정의한 JavaScript 함수를 호출할 수 있습니다:
using UnityEngine;
using System.Runtime.InteropServices;
public class NewBehaviourScript : MonoBehaviour {
[DllImport("__Internal")]
private static extern void Hello();
[DllImport("__Internal")]
private static extern void HelloString(string str);
// 기타 함수들...
void Start() {
Hello();
HelloString("This is a string.");
// 다른 함수 호출...
}
}
데이터 타입 전송
JavaScript에 간단한 숫자 타입을 전송할 수 있으며, 복잡한 데이터 타입은 EMscripten의 heap을 통해 포인터로 전달해야 합니다. 문자열을 전송할 경우, UTF8ToString
및 _malloc
을 사용해야 합니다.
예시
문자열 반환 값인 경우, 다음의 과정으로 메모리를 할당하고 문자열을 반환할 수 있습니다.
var returnValue = StringReturnValueFunction();
WebGL 텍스처와 상호작용
Unity는 WebGL 텍스처 ID를 매핑하는 GL.textures 배열을 제공합니다. JavaScript를 통해 텍스처를 바인딩할 수 있습니다.
브라우저 JavaScript에서 Unity 호출
Unity 스크립트가 브라우저 JavaScript로부터 메일을 받을 수 있도록, SendMessage
메소드를 사용할 수 있습니다. 다음은 이 메소드를 사용하는 방법입니다:
MyGameInstance.SendMessage('MyGameObject', 'MyFunction', value);
C/C++로 플러그인 구현
JavaScript 플러그인 대신 C/C++로 플러그인을 작성할 수도 있습니다. 이를 통해 Unity 스크립트에서 C/C++ 함수 호출이 가능합니다. C 링크로 함수를 선언하여 이름 맹글링 문제를 피할 수 있습니다.
예시
extern "C" void Hello() {
printf("Hello, world!\n");
}
extern "C" int AddNumbers(int x, int y) {
return x + y;
}
마무리
JavaScript와 Unity의 상호작용은 웹 기반 게임에서 필수적인 요소입니다. 위 가이드를 바탕으로 웹 콘텐츠와의 상호작용을 구현할 수 있을 것입니다. 추가로 Emscripten 및 Unity 관련 문서를 참고하여 더욱 다양한 기능을 탐험하시기 바랍니다.
굳이 추가적인 질문이나 궁금한 점이 있으면, Unity 커뮤니티나 포럼을 통해 도움을 받는 것도 좋은 방법입니다.