(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

(:3[kanのメモ帳]


本ブログの運営者kan.kikuchiが個人で開発したゲームです!


本当にインターネットに接続出来るかを確認する方法【Unity】


このエントリーをはてなブックマークに追加


この記事でのバージョン
Unity 2021.1.16f1


はじめに

UnityはApplication.internetReachabilityを使うことで、

インターネットのアクセス状態を返します。


簡単にインターネットのアクセス状態を取得出来ます。

NetworkReachability networkReachability = Application.internetReachability;

switch (networkReachability) {
  case NetworkReachability.NotReachable:
    Debug.Log($"ネットワークに繋がっていない");
    break;
  case NetworkReachability.ReachableViaCarrierDataNetwork:
    Debug.Log($"キャリア(携帯回線?)のネットワークに繋がっています");
    break;
  case NetworkReachability.ReachableViaLocalAreaNetwork:
    Debug.Log($"無線(Wi-Fi)または有線のネットワークに繋がっています");
    break;
}


しかし、internetReachabilityは接続の設定を確認しているだけなので、

実は本当にインターネットに接続出来るかを確認する事は出来ません。


例えばiPhoneでいう機内モードにして

どこにも接続してない設定であれば接続してない事が分かるのですが、

何かしらの回線に繋いだ設定で

電波状況の悪い所(トンネル等)に行った場合は接続出来ると判定されてしまいます。


さらにモバイル端末用なので、PCでは接続を切ったとしても常に接続されていると判定されます。

(ただし、Unityエディタ上では正常に動く)


と言う事で今回は本当にインターネットに接続出来るかを確認する方法のご紹介です!

f:id:kan_kikuchi:20210824145330j:plain



InternetAccessChecker

今回はUnityでサーバとデータの送受信したい時に使うUnityWebRequestを使って、

どこかしらにアクセスする事によりネット接続出来るかを確認してみたいと思います。



さっそくですがインターネットに接続されているか確認するクラスは以下のような感じです。

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;

/// <summary>
/// インターネットに接続されているか確認するクラス
/// </summary>
public static class InternetAccessChecker {
  
  //接続確認用URL
  private static readonly List<string> CHECK_TARGET_URL_LIST = new List<string>() {
    "https://google.com", "https://www.yahoo.co.jp"
  };

  /// <summary>
  /// インターネットに接続しているか確認
  /// </summary>
  public static IEnumerator Check(Action<bool> callback, int timeOut = 2) {
    //回線に繋がっていない(繋がっていても通信出来るとは限らないのでそっちの判定はしない)
    if (Application.internetReachability == NetworkReachability.NotReachable) {
      Debug.LogWarning($"インターネット接続確認失敗、回線に繋がっていません");
      callback(false);
      yield break;
    }

    //複数のURLで接続確認(1個だとそこが落ちてるかもしれないので)
    foreach (var url in CHECK_TARGET_URL_LIST) {
      Debug.Log($"インターネット接続確認開始 {url}");
      using var request = new UnityWebRequest(url) {timeout = timeOut};
      yield return request.SendWebRequest();
      
      if (request.result != UnityWebRequest.Result.Success) {
        Debug.LogWarning($"インターネット接続確認失敗 {url} : result {request.result} : error {request.error}");
        continue;
      }
        
      Debug.Log($"インターネット接続確認成功 {url}");
      callback(true);
      yield break;
    }
        
    callback(false);
  }

}


使い方は簡単、StartCoroutineを使ってInternetAccessChecker.Checkを実行するだけ。

private void Start() {
  //インターネットの接続を確認
  StartCoroutine(InternetAccessChecker.Check(FinishedCheckInternetAccess));
}

//インターネットの接続の確認が終了
private void FinishedCheckInternetAccess(bool isSuccess) {
  if (isSuccess) {
    Debug.Log($"インターネットに接続が出来ます");
  }
  else{
    Debug.Log($"インターネットに接続が出来ません");
  }
}
f:id:kan_kikuchi:20210824145330j:plain


なお、CHECK_TARGET_URL_LISTで接続テストをするURLを指定していますが、

例のように人様のサイトでやるのは行儀が良いとは言えない気がするので、

実際に使う場合は自分が管理しているのサーバ等にした方が良いかと思います。