2020/11/09
というわけで、今回はUnityのWebGL絡みのお話になります。
事の発端ですが、所謂「ハイスコアの記録」を開発中のゲームにも組み込みたいと考え始めた結果、WebGLビルドであればJavaScript経由でcookieが利用できるのではないかと感じた次第です。
やってみると意外と簡単にできたのでご紹介します。
検索するとよく引っ掛かるのはApplication.ExternalEval()を使用する方法ですが、こちらは既に廃止されているようです。
今はJavaScript用のプラグインファイルを作って実現するそうなので、以下のページを参考に作ってみます。
https://docs.unity3d.com/Manual/webgl-interactingwithbrowserscripting.html
JavaScriptプラグインの作成
Assetsフォルダ下にPluginフォルダを作成します。Assets下であればどの場所・階層でも大丈夫です。
Pluginフォルダ内に実行するJavaScriptを記述する.jslibファイルを作成します。VisualStudioではコード補完もハイライトもしてくれませんが、気合で書いていきます。
mergeInto(LibraryManager.library, {
SetHiScore: function(score) {
document.cookie = 'hi_score=' + score;
},
GetHiScore: function() {
return parseInt(document.cookie.split('=')[1]);
}
});
冒頭のmergeInto~の部分は固定のようなので、公式のものをそのまま持ってきました。
jQueryが使えないのでdocument.cookieに直接cookieを書き込んでしまいます。またGet時はparseInt()で型変換しないと上手く取得できないことがあるので注意します。
今回はhi_scoreというcookie名にしましたが、英語的にはhigh_scoreの方が適当かと思います。作ってから気付いてしまったので、今回は気にしないことにします!
プラグインの呼び出し
先ほどのJavaScriptの関数をスクリプト側から呼び出します。こちらも公式にサンプルがあるので参考にして書いていきましょう。
using System.Runtime.InteropServices;
public class ScoreManager
{
[DllImport("__Internal")]
private static extern void SetHiScore(int score);
[DllImport("__Internal")]
private static extern int GetHiScore();
public void SetScore(int score)
{
SetHiScore(score);
}
public int GetScore()
{
return GetHiScore();
}
}
スコアの保存と取得だけで良いのですごく単純です。
このクラスをインスタンス化し、SetScore()やGetScore()を呼び出せばOKです。
ちなみに私の場合はタイトル画面やゲームクリアorゲームオーバー時に呼び出しています。
プラットフォームの判定
上のソースで動作は問題ありませんが、エディタ上で実行すると「エントリポイントが見つからない」的な例外が出てしまいます。
エディタで再生する度に例外を出されても困るので、Application.platformで現在のプラットフォームを確認し、WebGLである場合のみ設定するようにします。
using System.Runtime.InteropServices;
using UnityEngine;
public class ScoreManager
{
[DllImport("__Internal")]
private static extern void SetHiScore(int score);
[DllImport("__Internal")]
private static extern int GetHiScore();
public void SetScore(int score)
{
if (CheckWebGLPlatform()) {
SetHiScore(score);
}
}
public int GetScore()
{
int score = 0;
if (CheckWebGLPlatform()) {
score = GetHiScore();
}
return score;
}
protected bool CheckWebGLPlatform()
{
return Application.platform == RuntimePlatform.WebGLPlayer;
}
}
CheckWebGLPlatform()という関数を作成し、bool値を返すようにしてみました。エディタの場合はスコア系が機能しなくなるのが難点ですが、代替案がないので常に0を返すようにしておきます。
この記事を見ていただいている方であれば問題ないかと思いますが、ブラウザの開発者ツールを使用することでcookieが保存されているか確認できます。
以下はChromeの場合で、「F12→Applicationタブ→Cookie→ドメイン選択」で表示できます。
しっかりhi_scoreというcookieが保存されていることが確認できます。
ただ今は期限を指定していないので、Chromeの場合は1969年というアレな値になってしまっています。今回は割愛していますが、ある程度長い期間保存したい場合は指定しましょう。






