今回はUnityのC#スクリプトからJavaScriptの関数を呼び出してみます。
なぜそれが必要になるかというと、ブラウザーのJavaScriptエンジンやAPIを使って何らかの操作をしたい時があるからです。
例えば、Application.persistentDataPathに保存したファイルが永続化されない場合に、JavaScriptを使ってIndexDBへの書き込み処理(非同期処理なのでいつ終わるかわからない為)をフラッシュして書き込む時等です。
JavaScriptのライブラリファイルを作成する
まずはJavaScriptの関数のライブラリファイルを作成します。
パソコンのデスクトップ等にテキストファイルを作成し、拡張子をjslibにします。
今回はTest.jslibファイルを作成し、以下のような処理を書きます。
1 2 3 4 5 6 7 8 9 10 11 12 13 | mergeInto(LibraryManager.library, { MyTestFunction: function() { window.alert("Test"); }, SyncFile: function() { FS.syncfs(false, function (err) { console.log('Error: syncfs failed!'); }); }, }); |
MyTestFunctionという名前の関数とSyncFileという名前の関数を作成しています。
MyTestFunction関数はTestという文字列をアラートで表示します。
SyncFile関数はApplication.persistentDataPathに保存したファイルが永続化されない時等のファイルの読み書きをした後に呼び出して書き込み操作をフラッシュする為の処理です。
この処理に関してはこの記事の最後に記載の参考サイトを参照してください。
Unityのエディターに実行したいJavaScript関数を書いたライブラリファイルを置く場所を作成します。
AssetsフォルダにPluginsフォルダを作成します。
ここに先ほどデスクトップに作成したTest.jslibライブラリファイルをドラッグ&ドロップして置きます。
Test.jslibファイルを選択し、インスペクタでWebGLにチェックが入っていることを確認します。
今回の場合はWebGLから実行するプラグインなのでWebGLのみにチェックを入れます。
Editorにチェックを入れてもUnityエディター上で確認出来ないので、確認する時はWebGL形式で出力し実行します。
JavaScriptを呼び出すUnityのC#スクリプトを作成する
JavaScriptのライブラリファイルが出来たので次はUnityのC#スクリプトからライブラリの関数を実行してみます。
新しくUseJavaScriptLibスクリプトを作成しヒエラルキーのMainCamera等に取り付けます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | using System.Collections; using System.Collections.Generic; using System.Runtime.InteropServices; using UnityEngine; public class UseJavaScriptLib : MonoBehaviour { [DllImport("__Internal")] private static extern void MyTestFunction(); [DllImport("__Internal")] private static extern void SyncFile(); // Start is called before the first frame update void Start() { MyTestFunction(); SyncFile(); } } |
DLLImportで内部プラグイン(__Internal)を指定します。
その下に実行したいJavaScriptのライブラリの関数を指定します。
後はその関数を実行したい場所で呼び出します(今回はStartメソッドで呼び出しています)。
今回は引数を使っていませんが、JavaScriptの関数で引数を使っていれば引数を渡すことも出来ます。
実行
後はWebGL形式でビルドし、実行するだけです(Build And Runで実行)。
ブラウザが開くと以下のようにアラートが表示されます。
またF12キーを押して開発ツールを開くと、ブラウザのコンソールでFS.syncfsでエラーが発生したのを確認出来ます。
スクリプトエラーで実行出来ない!?
スクリプトが正常に書かれているのにエラーが発生する場合は作成した.jslib内のスクリプトを書きなおしたり、ファイルを選択しインスペクタのSelect platforms for pluginのチェックを確認し、Applyボタンを押した後にUnityを再起動すると実行出来る場合もあります。
Unityを再起動するのは、一度スクリプトからプラグインがロードされるとアンロードされないみたいだからです。
終わりに
WebGL形式でPlayerPrefsでデータを保存する機能を使う時に今回の機能が使えそうです。
自作のタイピングゲームのデータ保存機能作る時に使えるかな・・・・