LoginSignup
10
5

More than 3 years have passed since last update.

UnityWebGLでスマホか否かを判別する

Posted at

はじめに

UnityのWebGLにおいてアクセスしている端末がスマホかどうか知りたい。そんなことするの自分だけかもしれないが。
そんなときApplication.platformやプラットフォーム依存コンパイルでは使っている端末がパソコンなのかスマホなのかが取得できないのでブラウザースクリプトとの相互作用を利用して取得する。

環境

  • Unity 2019.2.17f1

UnityとJavaScriptで互いに関数/メソッドを呼ぶ

UnityWebGLではUnityのC#からJavaScriptを呼び出したりその逆が可能。
WebGL: ブラウザースクリプトとの相互作用 - Unity マニュアル
詳しくは公式マニュアルを参照。

そこでこの記事ではC#からJavaScriptにユーザーエージェントを取得させ、それを元にUnityのメソッドを呼ぶことでスマホであるかをUnityに知らせる。

実際のコード

ファイル名や関数名などは各々のプロジェクトに合わせた形に書き換える。

Assets/Plugins以下に拡張子がjslibのファイルを作る。

CheckPlatform.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')
        }
    },
});
GameManager.cs
    //スマホかどうかを保存しておく
    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

10
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
5