概要
マスターサーバーを使うのは骨が折れるので、ここではIPアドレスを直に指定して接続します。マスターサーバーの使い方は参考図書(Unityゲーム開発 オンライン3Dアクションゲームの作り方)に詳しいです。
Unity5.0を対象とします。
macで作業する際の注意
本記事はWindows版をベースに解説しています。macでのプログラムコードの編集は、Visual Studio Codeがオススメです。Visual Studio Codeを利用する場合は、スクリプトをダブルクリックして開くとオートコンプリートが効かなくなるので、説明に「ダブルクリックしてコードを開く」と書いてあっても、Visual Studio Codeに切り替えて、EXPLOREから該当するコードを選択するようにしてください。
プロジェクトを作成
インターフェースを準備
今回は、ゲームサーバーのIPアドレスはユーザーに入力してもらいます。
- 最初に起動するプレイヤーは、ゲームサーバーボタンを押します。
- クライアントとして参加するプレイヤーは、ゲームサーバーを立ち上げた人からIPアドレスを聞いて、テキストボックスにゲームサーバーのIPを入力してクライアントとして接続します。
以上の操作のためのGUIを作成します。レイアウトなどは簡素にして、入力した値をすぐに使いたいので、旧来のOnGUI()を使って実装します。
- [NetConnector]スクリプトをエディターで開いて、以下の通り修正して保存します。
using UnityEngine; using System.Collections; using System.Net; public class NetConnector : MonoBehaviour { // 自分のIPアドレス private string myIP = ""; // 接続先のIPアドレス private string servIP = ""; // 接続が完了したときtrue private bool isConnected = false; // Use this for initialization void Start () { string hostname = Dns.GetHostName(); // ホスト名からIPアドレスを取得 IPAddress[] adrList = Dns.GetHostAddresses(hostname); foreach (IPAddress address in adrList) { myIP = address.ToString(); servIP = myIP; } } // Update is called once per frame void Update () { } void OnGUI() { // 未接続のとき、接続用UIを表示 if (!isConnected) { // ゲームサーバーになるボタン if (GUI.Button(new Rect(10, 10, 200, 30), "ゲームサーバーになる")) { } // IPの編集 servIP = GUI.TextField(new Rect(10, 50, 200, 30), servIP); // クライアントになるボタン if (GUI.Button(new Rect(10,80,200,30),"上のゲームサーバーに接続")) { } } } }
- IPアドレスを取得するコードは、
ローカル・コンピュータのIPアドレスを取得するには?[C#、VB] − @IT から引用しました。
- 上書き保存をして、Unityに移動して、起動して動作を確認してみてください。ボタンとテキストボックスにIPアドレスが表示されていればOKです。
ネットに接続したときの処理を行う関数を作成
サーバーやクライアントとしてネットワークに接続した時に行う各種処理を実行するための関数を用意しましょう。
- [NetConnector]スクリプトをエディターで開きます。
- 以下の関数を追加します。
private void procConnect() { isConnected = true; }
ゲームサーバーになる
「ゲームサーバーになる」ボタンを押したときの処理を実装します。
- [NetConnector]スクリプトをエディターで開きます。
- [void OnGUI()]関数内の「ゲームサーバーになる」処理のif内に以下のコードを追加します。
// ゲームサーバーになるボタン if (GUI.Button(new Rect(10, 10, 200, 30), "ゲームサーバーになる")) { if (Network.InitializeServer(20, 25000, false) == NetworkConnectionError.NoError) { procConnect(); } else { Debug.Log("ゲームサーバー初期化エラー"); } }
- 上書き保存して起動してください。ゲームサーバーボタンを押して、サーバーの初期化に成功すると、GUIが消えます。
サーバーを立ち上げるのは簡単です。Network.InitializeServer()関数を呼び出して、同時接続上限、ポート番号、NATの利用を引数に指定します。この例では、同時に20人まで参加できて、ポート番号を25000で待機して、NATは利用しないことにしています。
ポート番号とは、ネットワークに接続するプログラムを番号で指定するためのものです。とりあえず25000などを指定しておけば問題ありません。
NATの設定はルーターなどを越える際に利用します。今回はLANでの利用を想定しているので利用しません。
クライアントとして接続する
クライアントからゲームサーバーに接続する処理を実装しましょう。
- [NetConnector]スクリプトをエディターで開きます。
- [void OnGUI()]関数内の「クライアントになるボタン」のif文の中に以下のコードを実装します。
// クライアントになるボタン if (GUI.Button(new Rect(10,80,200,30),"上のゲームサーバーに接続")) { if (Network.Connect(servIP, 25000) == NetworkConnectionError.NoError) { procConnect(); } else { Debug.Log("接続エラー"); } }
- 上書き保存します。
クライアントとして接続するのも簡単で、Network.Connect()関数を呼び出します。引数には、ゲームサーバーのIPアドレスとポート番号を指定します。
ゲームサーバーが立ち上がっていないと接続できませんので、誰か最初の一人がゲームサーバーになり、その他の人はゲームサーバーが立ち上がったのを確認したらクライアントとして接続します。
接続を試してみましょう。同じPC上でプログラムを2つ実行するために実行ファイルを生成します。
- Unityに切り替えます。
- メインメニューから[File]>[Save Scene]を選択して、「simplenet」などの名前でシーンを保存します。
- メインメニューから[File]>[Build Settings]を選択します。
- [Add Current]ボタンを押して、[simplenet]シーンをシーンに追加します。
- [Player Settings...]ボタンを押します。
- [Inspector]ビューで以下を設定します。
- [Default Is Full Screen]のチェックを外します。
- [Default Screen Width]を640、[Default Screen Height]を480にします。
- [Run In Background]欄にチェックを入れます。これでウィンドウがアクティブじゃなくても動くようになります。
- [Build and Run]ボタンを押します。
- 「simplenet」などの名前で実行ファイルを生成します。
以上ができたら試してみましょう。
- ビルドされた実行ファイルが起動します。
- Windowモードにしてから[Play!]を選択して起動したら、「ゲームサーバーになる」を押して、必要であれば[アクセスを許可する]を選びます。
- Unityに切り替えて起動します。
- 「上のゲームサーバーに接続」ボタンを押します。
成功の場合、どちらの画面からもGUIが消えるはずです。
以上で、ゲームサーバーと、クライアントを接続することができました。ネットワークでお互いのIPが参照できれば、別のPCでも接続できます。次は、キャラクターを登場させてみましょう。