2020/11/09
というわけで、今回はUnityのWebGLに関するちょっとしたお話です。
WebGLで実行時に例外が出た場合に、ブラウザの開発者ツールのコンソールに表示する方法を考えてみました。
ちなみにこんなタイトルで記事を作っておいてアレですが、わざわざ作らなくても勝手にコンソールに出力してくれるようです。WebGLでのコンソール出力方法や例外出力の勉強にはなったので記事として載せておきます。
コンソール出力用関数の作成
まずは.jslib
ファイルにconsole.log()
を実行する関数を追加します。作成した.jslib
ファイルはPlugin
フォルダに入れておきましょう。
mergeInto(LibraryManager.library, { ConsoleLog: function(message) { console.log(Pointer_stringify(message)); } });
次に.jslib
ファイルのConsoleLog()
を呼び出す関数を作成します。適当なユーティリティクラスを作り、静的に呼び出せるようにした方が便利かと思います。
using System.Runtime.InteropServices; using UnityEngine; public class LogUtil : MonoBehaviour { [DllImport("__Internal")] private static extern void ConsoleLog(string logString); /// <summary> /// ブラウザのコンソールにメッセージを出力する /// </summary> /// <param name="score"></param> public static void OutputConsoleLog(string message) { if (CheckWebGLPlatform()) { ConsoleLog(message); } } public static bool CheckWebGLPlatform() { return Application.platform == RuntimePlatform.WebGLPlayer; } }
ポイントはJavaScript側で文字列を出力する際にPointer_stringify()
を挟むことです。渡された変数をそのまま使用すると数値が出力されて残念なことになります。
このことは公式マニュアルに書いてあるのですが、結構長い間見落としていたためかなり詰まってしまいました。
https://docs.unity3d.com/Manual/webgl-interactingwithbrowserscripting.html
ここまで来たら一度WebGL環境で試してみましょう。適当なスクリプトのStart()
内でLogUtil.OutputConsoleLog()
を呼び出します。
ビルドが正常に終わらなかったり、WebGLで実行時に止まってしまう場合は.jslib
ファイルの構文を確認してみてください。
例外発生時の出力
Application.logMessageReceived
にイベントを追加し、例外発生時にコンソールログを出力するようにします。例外かどうかは引数のLogType
で判定することができます。
ちなみにApplication.RegisterLogCallback
は古い形式のようです。こちらで紹介されているサイトもあるので注意しましょう。
以下のコードを適当なスクリプトに追加します。
void Awake() { // ログ出力時のイベント追加 Application.logMessageReceived += (string logString, string stackTrace, LogType type) => { if (type == LogType.Exception) { LogUtil.OutputConsoleLog(logString); } }; }
これで例外発生時にコンソールログに出力されます。試す場合は適当なスクリプトのStart()
あたりで例外を投げてみてください。
ただ冒頭でお話した通り、例外なら勝手に出力されてくれるので、何かデバッグ用に出力したい時に使うようにします。