JavaScript プラグインの関数を Unity C# コードで使用できます。ウェブページの他の要素や Web API との通信が必要な場合があるため、Unity で JavaScript コードを使用すると便利です。
ファイルタイプと Unity スクリプトとのインタラクション用の JavaScript プラグインの設定方法については、JavaScript プラグインの設定 を参照してください。代わりに C/C++/C# プラグインと相互作用する方法については、Unity C# スクリプトから C/C++/C# 関数を呼び出す を参照してください。
| トピック | 説明 |
|---|---|
| JavaScript から Unity にさまざまな変数を渡す | Unity と JavaScript 間でさまざまな変数を渡す方法に関するヒント。 |
| それ自体のスコープでビルドコードを実行する | Unity と JavaScript 間のコードの可視性を向上させるためのヒント。 |
| JavaScript 関数を呼び出す Unity C# コードの例 | このサンプルコードは、Unity で JavaScript 関数を呼び出す方法を示しています。 |
| Unity プラグインをリファレンスとして使用する | Unity に含まれている、リファレンスとして使用できるプラグインのリストを示します。 |
JavaScript を Unity と統合するには、両者間の効率的な通信が必要です。JavaScript から Unity にさまざまな型のデータを渡す方法については、以下のヒントを参照してください。
単純な数値型は、変換せずに関数パラメーターで JavaScript に渡すことができます。
例えば、JavaScript のこの関数:
js
AddNumbers: function (x, y) {
return x + y;
},
は、変換なしで C# の整数値を受け入れます。
int result = AddNumbers(5, 7);
その他のデータ型は、Emscripten ヒープ内のポインターとして渡すことができます。Emscripten ヒープは JavaScript メモリ内の大きな配列にすぎません。
文字列を JavaScript 文字列に変換するには、UTF8ToString ヘルパー関数を使用します。
var stringMessage = UTF8ToString("Hello World");
文字列値を返すには、メモリを割り当てるために _malloc を呼び出し、JavaScript 文字列をメモリに書き込むために stringToUTF8 ヘルパー関数を呼び出します。文字列が戻り値の場合は、IL2CPP ランタイムが自動的にメモリを解放します。
var returnStr = "Hello World";
var bufferSize = lengthBytesUTF8(returnStr) + 1;
var buffer = _malloc(bufferSize);
stringToUTF8(returnStr, buffer, bufferSize);
プリミティブ型の配列の場合、Emscripten はメモリを表すさまざまなサイズの整数、符号なし整数、浮動小数点のヒープに対して、異なる ArrayBufferViews を提供します。HEAP8、HEAPU8、HEAP16、HEAPU16、HEAP32、HEAPU32、HEAPF32、HEAPF64 などです。
以下の関数は、HEAPF32 配列をループして、各インデックスの値を出力します。
PrintFloatArray: function (array, size) {
for(var i = 0; i < size; i++)
console.log(HEAPF32[(array >> 2) + i]);
},
WebGL のテクスチャにアクセスするために、Emscripten は GL.textures 配列を提供し Unity から WebGL テクスチャオブジェクトへネイティブのテクスチャ ID をマップします。WebGL 関数は、Emscripten の WebGL コンテキスト GLctx で呼び出すことができます。
例えば、以下の関数は WebGL テクスチャを GL テクスチャ配列から 2D テクスチャにバインドします。
BindWebGLTexture: function (texture) {
GLctx.bindTexture(GLctx.TEXTURE_2D, GL.textures[texture]);
},
すべてのビルドコードはそれ自体のスコープで実行することを推奨します。コードがそれ自体のスコープにある場合は、埋め込みページのコードと競合することなくページにコンテンツを埋め込むことができます。また、同じページに複数のビルドを埋め込むこともできます。
プロジェクト内の JavaScript コードがすべて .jslib プラグインの形式である場合、この JavaScript コードはコンパイルされたビルドと同じスコープ内で実行され、コードは以前のバージョンの Unity と同じように動作します。JavaScript プラグインコードから直接見ることができるオブジェクトと関数には、以下のようなものがあります。
* Module
* SendMessage
* HEAP8
* ccall
埋め込みページのグローバルスコープから内部 JavaScript 関数を呼び出す場合は、ウェブテンプレート index.html で unityInstance 変数を使用する必要があります。
Unity エンジンのインスタンス化が成功した後に、例えば以下のように unityInstance を使用します。
var MyGameInstance = null;
script.onload = () => {
createUnityInstance(canvas, config, (progress) => { /*...*/ }).then((unityInstance) => {
MyGameInstance = unityInstance;
次に、MyGameInstance.SendMessage() を使用してビルドにメッセージを送信したり、MyGameInstance.Module を使用してビルドモジュールオブジェクトにアクセスしたりできます。
以下の JavaScript コードでは、Hello という名前の関数を作成します。この例では、このコードを JavaScript プラグインで使用して、Unity C# スクリプトで呼び出せるようにします。
mergeInto(LibraryManager.library, {
Hello: function () {
window.alert("Hello, world!");
},
});
次に、Unity プロジェクトでこの C# コードを使用して、JavaScript コードから Hello 関数を呼び出します。
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# 関数を呼び出す を参照してください。
Unity のインストールフォルダーには、リファレンスとして使用できるプラグインがいくつかあります。
PlaybackEngines/WebGLSupport/BuildTools/lib
PlaybackEngines/WebGLSupport/BuildTools/Emscripten/src/library*