前回はUNET (Network Manager) を使って通信をしようと試みた。
この機能を使うと簡単に通信ができたがホストが通信を始めた瞬間にゲームスタートになり、クライアントが通信するとそこにスポーンする形になってしまう(MMOみたいな感じ)。
そこで一旦ロビーに集めて、人数がそろったら始める形式に変更する。
そのためのクラスが NetworkLobbyManagerとして用意されている。
最初は1から設定していたけど、Network Managerとも勝手が違って心が折れた。
公式提供のフリーアセットがあったのでそれを使わせてもらうことにした(Tanks!とかを参考にしてたけど、それもこのアセットを利用していた)。
最低限の使い方であれば4ステップでできる
- タイトル・ロビー用シーンとゲームシーンを用意する(BuildSettingsに登録する)
- Lobby > Prefab > LobbyManagerを取り出す
- Manager の Lobby Scene と Play Scene に用意したシーンをアタッチ
- Manager の Game Player Info に Lobby > Prefab > PlayerInfoをアタッチ
「PLAY AND HOST」でホスト参加して、他はIP入れてJOINすれば通信できます。
現状だとlocalhostの通信になるので適切なIPとなるように変更しないといけない。
LobbyMainMenu.cs の OnClickHost でIPを取得するコードを追加しました。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
using System.Net; ... public void OnClickHost(){ string hostname = Dns.GetHostName(); //IPAddress[] adrList = Dns.GetHostEntry(hostname).AddressList; //.NET2.0未満はこっち IPAddress[] adrList = Dns.GetHostAddresses(hostname); string ip = ""; foreach (IPAddress adr in adrList){ if(adr.AddressFamily==System.Net.Sockets.AddressFamily.InterNetwork)ip=adr.ToString(); } lobbyManager.networkAddress = ip; lobbyManager.StartHost(); } |
これで同一ネットワーク内なら複数端末で集まることができるようになりました。
SIM通信も同じようにできるのかと思ったけど無理でした。
セキュリティ(ファイアウォールとか)か権限不足か、そもそもネットワークに関して勘違いがあるのか。
とりあえず今回はここまで。
追記
IPを取得するためにごちゃごちゃしてたけど Network.player.ipAddress
で取得できるみたいです。
追記2
このへんを見て色々と必要なことがわかってないと理解した。どうするかな。
Once you get port forwarding working, you can then use the Unity standard API to directly connect to another player in another network.