はじめに
UnityのWebGLにおいてアクセスしている端末がスマホかどうか知りたい。そんなことするの自分だけかもしれないが。
そんなときApplication.platform
やプラットフォーム依存コンパイルでは使っている端末がパソコンなのかスマホなのかが取得できないのでブラウザースクリプトとの相互作用を利用して取得する。
#環境
- Unity 2019.2.17f1
#UnityとJavaScriptで互いに関数/メソッドを呼ぶ
UnityWebGLではUnityのC#からJavaScriptを呼び出したりその逆が可能。
WebGL: ブラウザースクリプトとの相互作用 - Unity マニュアル
詳しくは公式マニュアルを参照。
そこでこの記事ではC#からJavaScriptにユーザーエージェントを取得させ、それを元にUnityのメソッドを呼ぶことでスマホであるかをUnityに知らせる。
#実際のコード
ファイル名や関数名などは各々のプロジェクトに合わせた形に書き換える。
Assets/Plugins
以下に拡張子がjslibのファイルを作る。
mergeInto(LibraryManager.library, {
CheckPlatform: function () {
//ユーザーエージェントを取得して全て小文字に変換する
var ua = window.navigator.userAgent.toLowerCase();
//ユーザーエージェント文字列にandroidかiosが含まれているか
if(ua.indexOf("android") !== -1 || ua.indexOf("ios") !== -1){
//今開いているシーンにあるGameManagerというオブジェクトにアタッチされているスクリプトのsetSmartPhoneModeというメソッドを呼ぶ
unityInstance.SendMessage('GameManager', 'setSmartPhoneMode')
}
},
});
//スマホかどうかを保存しておく
public static bool IsSmartPhone { get; private set; } = false;
//JavaScriptから呼び出すメソッド
public void setSmartPhoneMode()
{
IsSmartPhone = true;
}
そして、以下のようにすることでJavaScriptを呼びC#にスマホであることを知らせることができる。
[DllImport("__Internal")]
private static extern void CheckPlatform();
//Startではなくてもいい
void Start()
{
//こうしておかないとUnityEditorでCheckPlatformを呼ぼうとしてエラーになる
#if (UNITY_WEBGL && !UNITY_EDITOR)
CheckPlatform();
#endif
}
#最後に
今回の記事では端末がAndroidかiOSであるとしか判別していないが、ユーザーエージェント文字列をそのままUnityに送るなどすればブラウザやOSの種類も取得できる
#参考リンク
WebGL: ブラウザースクリプトとの相互作用 - Unity マニュアル
JavaScriptでブラウザとOSを判定する2つの方法 - Qiita