はじめに
Unity WebGLでブラウザの機能を呼び出す際はJavaScriptとは少し異なるjslib(JavaScript Library)を利用することになりますが、jslib内で同一スコープ内の共通メソッド呼び出し時には特殊な手続きが必要となるため、その方法について説明します。
基本ルール
- 呼び出し時のみ関数名のプレフィックスにアンダースコアが必要(例: _FancCommon)
- メソッド名はビルド後にプレフィックスが付与される
- メソッド定義はアンダースコアの記述は不要
- C#から呼び出されない共通メソッドはコンパイル時に削除されるため、依存性の宣言が必要(例: FancA__deps: ['FancCommon'])
- 依存性の宣言は1メソッドあたり一つがあればストリッピング対象から外れるため、以下のサンプルコードの様に2箇所に
***__deps
を記述しなくても動作する
- 依存性の宣言は1メソッドあたり一つがあればストリッピング対象から外れるため、以下のサンプルコードの様に2箇所に
サンプルコード
以下に、jslibで共通メソッドを呼び出すサンプルコードを示します。
SampleJslib.jslib
var LibraryMyPlugin = {
// 依存関係の宣言でメソッドの削除を抑制
FancA__deps: ['_FancCommon'],
FancB__deps: ['_FancCommon'], // こちらは省略可能
FancCommon: function (value) {
// 共通の処理
console.log("共通メソッドが呼び出されました: " + value);
},
FancA: function (param) {
console.log("FancAが呼び出されました");
// 共通メソッドの呼び出し
_FancCommon(param);
},
FancB: function (param) {
console.log("FancBが呼び出されました");
// 共通メソッドの呼び出し
_FancCommon(param);
},
};
mergeInto(LibraryManager.library, LibraryMyPlugin);
【おまけ】C#からjslibの関数を呼び出す部分
jslibの関数をC#から呼び出すためには、C#内で外部関数を宣言し、DllImport属性を使用します。
以下に、C#から先ほどのサンプルコード内のFancAとFancBを呼び出す方法を示します。
using System.Runtime.InteropServices;
using UnityEngine;
public class SamplePluginCaller : MonoBehaviour
{
// jslibの関数を宣言
[DllImport("__Internal")]
private static extern void FancA(int param);
[DllImport("__Internal")]
private static extern void FancB(int param);
void Start()
{
// jslibの関数を呼び出す
FancA(10);
FancB(20);
}
}