【Unity】超簡単にインターネットのアクセス状況を調べて処理を分岐させる

【Unity】超簡単にインターネットのアクセス状況を調べて処理を分岐させる

今猫が風船で空を飛ぶゲームを作っているのですが、その中でインターネット接続を確認する必要が出てきました。

飛んだ高さを競うランキング機能を無駄に入れているので、インターネットを使ってサーバーにデータを送信したいんです。

んで調べてみたら簡単にネットワークの状態を調べられるAPIがあるじゃないですか。

そのAPIはApplication.internetReachability。無理やり和訳するとインターネットの到達状況? 通信の状態を保持しているstaticな変数を確認することで今のネットワークの状況を見ることができます。うーん便利。

 

環境

macOS 10.13 High Sierra

Unity2018.2.9f1

パッチバージョンがついに9まで行きました。

というかこの記事を書いている2018/10/1時点では10fまでリリースされてました。更新早すぎィ!

Applicationクラス

インターネットのアクセス状況を保持しているApplicationクラスはUnityEngineの下にあるクラスです。名前で見当がつくかもだけど、実行しているアプリケーションの状態を保持しています。

この中にinternetReachabilityの変数があり、ここを見ることでインターネットアクセスの状態が分かります。

特にスマートフォン向けのアプリを開発している場合には大切で、インターネットに繋がっていないのにサーバーアクセスしようとして延々と処理待ち、なんて事故を未然に防ぐことができます。

スマートフォンの場合は必ずしもみんながWi-Fiを使っている訳ではないし、場合によっては格安SIMなどを使っていて通信容量も少ない、なんてことが稀によくあります。

昨今のスマホゲーではソシャゲが多く、基本的にスマホのゲームはインターネット通信をするもの、なんて意識もありそうだけど、この辺りのハンドリングを入れておくとユーザーフレンドリーなゲームになると思います。

NetworkReachabilityについて

Application.internetReachabilityの変数ではNetworkReachability型のEnumが返ってきます。

Enumは列挙型で、状態がそれぞれリストアップされています。マニュアルはこちら

  • NotReachable …… インターネットに接続していない
  • ReachableViaCarrierDataNetwork …… キャリアネットワークで接続している
  • ReachableViaLocalAreaNetwork …… Wi-Fiでネットワークに接続している

この3つの状態のいずれかが返ってくるため、その結果に応じてハンドリングするといい感じです。

NotReachableだとインターネットに繋がっていないので、「通信状態のいい場所に移動してください」などのダイアログを出すと親切かもしれません。

ReachableViaCarrierDataNetworkだとキャリアネットワークを使っている状態なので、重たいリソースのダウンロードは避けるといったことも考えられます。ただ最近だと「ほぼ使い放題」のようにWi-Fiを使わずキャリアネットワークをメインにしている人もいるでしょうから、キャリアネットワークとWi-Fiで下手に分けない方が安全かもしれませんね。処理を分けるにしても警告だけ出しておくのが無難。

という訳でここでは単純にインターネットに繋がっている/繋がっていないの分岐を導入してみます。

分岐のサンプル

Unityエディタを起動しているマシンのWi-Fiをオン/オフした時に、それを検知してくれるスクリプトを書いてみます。

Update()の中からCheckNetworkState()を毎フレーム呼び出し、システムのWi-Fiがオンである場合のメッセージ、オフである場合のメッセージをそれぞれ画面のテキストオブジェクトにセットしています。

Application.internetReachabilityはstaticな変数なので、そのまま確認できます。便利。

そしてやっていることはif文で条件を確認しているだけ。超簡単。

動作確認

上記のスクリプトを任意のオブジェクトにアタッチして実行した結果が以下のもの。

Wi-Fiの状態を切り替える際にSSIDが見えちゃうのもなんだか恥ずかしかったため、以下のGIF画像の中ではONになっているタイミング、OFFになっているタイミングをテロップとして入れています。ONの状態でスタート→Wi-FiをOffに→再びOnの順番になっています。

ネットワークの状態に応じてメッセージを切り替える
ネットワークの状態に応じてメッセージを切り替える

 

毎フレーム確認するようにすると、切り替えた時にすぐ検知してくれます。

が、実際には毎フレームの確認はせず、通信が必要になったタイミングでインターネットの接続状況を確認するのがいいかも。

「通信中」のダイアログを出しつつ、ネットワークがONならそれでよし、OFFなら何秒か待った後にリトライする、それでもダメならユーザーにやり直すように通知する、みたいな感じでしょうかね。

まとめ

インターネットを使って通信するアプリを作る際には、インターネットの接続状況を確認するのが大事。

Unityでは簡単にインターネットの接続状況を確認できるのでサクッと実装しましょ。

アセット作ってます!

CTA-IMAGE

Unityでの開発に役立つアセットを作っています。

3DダンジョンRPGを開発するスピードを200%加速するAssetや、ファンタジーRPGのダンジョンを彩るパーツを取り揃えています。

特に3DダンジョンRPGのゲームを1から作るのは結構時間がかかります。ダンジョン部分の作成はこうしたアセットを使って、開発をブーストさせてみませんか?