Unity製Androidアプリケーションでソケット通信を実現する話(AndroidPro不使用 要25ドル)

ここらへんの話はぐぐっても良い結果が日本語でヒットしなかったので最近やってたこととしてメモしておきます。
ソケット通信ができるとこんなことができるようになります。


環境:
OS:Windows7 64bit Professional
Unity:Unity Pro4.3.4f1(Free版でもできることを確認しました。) AndroidProライセンスは持ってないです。
Android:Xperia Z1 SO-01F docomo Android4.2.2



Unity製Androidアプリケーションでソケット通信をするプログラムを書いた際の問題点として「ソケット通信はAndroidProライセンスを持っていないとできない」ということが挙げられます。
参照:http://japan.unity3d.com/unity/licenses のAndroidの項目

普通にSystem.Net.Socketsライブラリを使ったコードをAndroidにビルドしても動きません。
というかビルド最中に
「Error building Player: SystemException: 'System.Net.Sockets' are supported only with Unity Android Pro. 」というエラーで怒られると思います。

ではどうしたら良いかというと金の力が発揮されてきます。
「Unity Android UDP」あたりでぐぐるとUnityAnswersの方にいくつか解決法が提示されているのですが、サーバを介してやる方法だったりAndroidProライセンス大人しく買えやみたいな話だったりJavaのコード呼び出してどうにかする話だったり物騒な話が多いです。



その中で一番簡単な方法としてGood'ol Socketsというアセットを使う方法を今回記事にしようと思います。
Good'ol Socktetsとは:
要はUnityFreeバージョン(もちろんAndroidProもいらない)でソケット通信が使えるようになりますよってやつです。
Good'ol Socketsの詳細はこちら

このアセットはSystem.Net.Socketsの中身を全部LostPolygon.System.Net.Socktetsライブラリで実現しています。
また名前空間が違いだけでクラス名(UdpClientとかTcpListenerなど)が一緒なので今まで書いていたコードの"System.Net.Socktets"を"LostPolygon.System.Net.Socktets"に変更するだけでUnityFreeでもソケット通信ができるようになるというすぐれものです。


ほんとにこれだけなので書くことがもうないんですけど、まとめますと
・Good'Ol Socketsをプロジェクトにインポート
・メニューバーに追加されるパッチを当てる(下の画像参照)

これでコードの問題は解決しました。これで使えるようになります。


と言いたいところなんですが、実はこれだけでは何故かできませんで…
それで勘でメニューバーのFile→Build Settings...→PlayerSettingsのAndroidの項目からInternetAccessをAutoからRequireにしたら動作するようになりました。

これがたぶん一番早いと思います。



小ネタというか、不具合?
自分に限った話かもしれませんが、InternetAccessをAutoRequireにするとUnity Remoteが動作しなくなります。
(※Unity RemoteというのはUnityプロジェクトでiOS(Android)デバイスをリモコンとして使用出来るアプリケーションです。詳しくは【超便利】Unityでモバイル開発〜Unity Remote〜
こちらのブログにわかりやすく書かれているので参照してください。)

なお、InternetAccessをAutoにするとUnity Remoteは再度動くようになります。

以上です。