質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

1308閲覧

Unityでネットのアクセス状況を調べてたい

tosao1974

総合スコア13

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

1クリップ

投稿2019/04/02 02:57

編集2019/04/02 03:29

前提・実現したいこと

Unityでインターネットのアクセス状況を調べて処理を分岐させたいと
思っております。

発生している問題・エラーメッセージ

ネットで調べて「Application.internetReachability」を使用すれば可能
なようですが「Play」状態では機能するのですがビルドでPC用に「.exe」書き出しすると機能しません。
play時はネット回線をオン、オフするとDebugおよびテキストが切り替わるのですがビルドして回線をオフしても常に「Wifiかケーブルで接続」状態です。
「Application.internetReachability」はPC用にビルドすると使えない???などということがあるのでしょうか?

該当のソースコード

if (Application.internetReachability == NetworkReachability.NotReachable){
// ネットワークに接続されていない状態
networkState.text = "ネットワークに未接続だっ! 通信環境をチェック!";
} else {
// ネットワークに接続されている状態
networkState.text = "ネットワークに接続されているよ!";
}

もしくは

switch (Application.internetReachability) {
case NetworkReachability.NotReachable:
Debug.Log("接続されてないよ");
break;
case NetworkReachability.ReachableViaCarrierDataNetwork:
Debug.Log("キャリアネットワークで接続してるよ");
break;
case NetworkReachability.ReachableViaLocalAreaNetwork:
Debug.Log("Wifiかケーブルで接続してるよ");
break;
}

試したこと

Unityのバージョンの問題化と思い
・5.6.4
・2017.3.1
・最新版2018.3
でそれぞれ試してみましたが結果は同じでした。

補足情報(FW/ツールのバージョンなど)

使用環境は
Windows8.1
です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2019/04/02 03:02

機能しない、とはどういう動作になるんでしょうか
tosao1974

2019/04/02 03:09

play時はネット回線をオン、オフするとDebugおよびテキストが切り替わるのですがビルドして回線をオフしても常に「Wifiかケーブルで接続」状態です。 もしかして「Application.internetReachability」はビルドすると使えない???とかですかね??
y_waiwai

2019/04/02 03:20

質問は編集できますんで、そこら辺のことを追記していただけるとよろしいかと
tosao1974

2019/04/02 03:26

ありがとうございます
stdio

2019/04/02 03:28

スマホではいけそうな感じします。スマホ用に作られているのであれば、Android等でのデバックをおススメ致します。
tosao1974

2019/04/02 03:33

今回PC用のアプリを作っておりまして… ネットの記事でもスマホっぽいことが書かれていたのですが公式サイトには特にそのような内容の注意書きがないので困っております。
guest

回答1

0

ベストアンサー

おそらくPCだと「NetworkReachability.ReachableViaLocalAreaNetwork」が返ってくるかと思います。
internetReachability などと言ってますが、これは実際に接続しているかどうかをきちんと確認しているわけではないそうです。あくまでモバイル端末の接続のための状況(端末側の設定)を見ているだけのようです。

下記の通りドキュメントに記載されています。

Note: Do not use this property to determine the actual connectivity. E.g. the device can be connected to a hot spot, but not have the actual route to the network. Non-handhelds are considered to always be capable of NetworkReachability.ReachableViaLocalAreaNetwork.

実際の接続性の確認のためこのプロパティを利用しないでください。
非モバイル機器の場合は常にNetworkReachability.ReachableViaLocalAreaNetworkが返ってきます。

Unityドキュメント: Application.internetReachability

別のアプローチとしてバックグラウンドでURLにアクセスさせてその結果から接続状況を得るという方法ができるそうです。マニュアルだけ見て書いたのでお好みの動作をするかはわかりませんが、とりあえず裏でhttp://google.comにリクエストを出してその結果をチェックする感じのようです。

cs

1 IEnumerator CheckInternetAccess() { 2 UnityWebRequest request = new UnityWebRequest("http://google.com"); 3 4 yield return request.SendWebRequest(); 5 6 if (request.isNetworkError) { 7 Debug.Log(request.error); 8 } else { 9 Debug.Log("Access Done"); 10 } 11 }

投稿2019/04/02 04:26

hogefugapiyo

総合スコア3302

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tosao1974

2019/04/02 09:40

ご回答いただきましてありがとうございます。 やはりモバイル端末でしか対応していないんですね。。。 ご回答いただきました別アプローチの方法でトライしてみましたところイメージ通りの動作を確認することができました! 大変感謝いたします。 ただ当方のUnity環境が5.6.4をメインで使用しているため「request.isNetworkError」が対応しておりませんでした。 アプリのUnityバージョンを上げることも視野に入れて検討してみたいと思います。 ありがとうございました!
hogefugapiyo

2019/04/03 01:54 編集

恐らく is.Error とかそのあたりで旧バージョンは対応可能かもしれません。 internetReachabilityに関してはスマホゲームを作る際に「大容量のデータをダウンロードしますがよろしいですか?(WI-FI利用をおすすめします)」みたいな表示を出したい時とかには重宝するプロパティかと思います。
tosao1974

2019/04/03 07:06

ご連絡ありがとうございます! if (request.isError) {}で回避できました! またSendWebRequest();も使用のバージョンで使えなかったので yield return request.Send(); に変更しましたところ無事機能しました。 大変助かりました!感謝申し上げます。
IShix

2019/04/03 07:40 編集

上記でバッチリだと思いますが1点共有します。 UnityWebRequestはGCに依存しないのでDispose()を呼ぶ必要があります。 GCに通知しないと使用したメモリを解放してくれず、いつまでも占有されたままになります。 C#にはusingステートメントというものがあって自動でrequest.Dispose()を呼んでくれる機能があります。例外時でも呼んでくれるのでおすすめです。書き方は下記のような形となります。 using (UnityWebRequest request = new UnityWebRequest("http://google.com")) { yield return request.Send(); if (request.isError) { Debug.Log(request.error); } else { Debug.Log("Access Done"); } }
IShix

2019/04/03 07:56

あと、上記で成功されているのでしたら良いのですが サーバーの通信可否の確認はpingを飛ばしてチェックするのが一般的です。 スマホ向けでは利用できませんがPC向けなら利用できると思います。
tosao1974

2019/04/05 10:38

ご連絡いただきありがとうございます! 当方初心者なためいろいろと勉強になります! 教えていただきました書き方を参考にさせていただきたいと思います。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問