サーバへの接続から切断までの一連の流れを作る

目次

  概要
  空のオブジェクトの作成とスクリプトの登録
  スクリプト編集の下準備
  スクリプトの編集
  サーバへの接続
  ルームの作成
  選択式でのルーム入室
  ランダム式でのルーム入室
  ルームからの退室
  サーバからの切断
  ここまでのNetworkControlの内容
  ここまでの内容について、一旦セーブする


概要

オンライン制御部分の作成

  さて、素材に関するオンライン制御の準備が一通り整ったところで、ここからプログラミングに入ります。

  現在提供されているサンプルゲームはオフライン専用のものですので、
  マルチプレイ・オンラインゲーム化のために、以下の機能を実装する必要があります。

    ・サーバへの接続
    ・ルームの作成
    ・選択式でのルーム入室
    ・ランダム式でのルーム入室
    ・ルームからの退室
    ・サーバからの切断

  前章で触れた部分もありますが、改めて「オンライン制御部分」について作成してみましょう。

注記:このページ内容を反映させても、実行ボタンを押して正常な結果を得ることはできません。

  もうしばらくの辛抱です。次のページからは実行も含め確認ができます。

  オフラインゲームを作る上でも、出来うることであれば、プレイヤーキャラクタも含め、
  「常に同期させなければならないオブジェクト」について、あらかじめプレハブ化させておくことが望ましいです。


空のオブジェクトの作成とスクリプトの登録

空のオブジェクトを作成する

  Unity メニューから GameObject > Create Empty を選択してください。
  Hierarchy に「空のオブジェクト」である GameObject が生成されます。

空のオブジェクトに「MonobitView」を追加する

  作成した GameObject をクリックします。
  Inspector に表示される [Add Component] のボタンを押します。
  プルダウンメニューから Monobit Networking > Monobit View を選びます。
        
  以下のように、Inspector に Monobit View が登録されます。

MonobitView ID を変更する

  追加した Monobit View に対し、IDの変更を行ないます。
      ※ デフォルト値は 0 ですが、シーン上に配置された静的オブジェクトの場合、
      この値を 1~999 の範囲で設定する必要があります。

  今回はこの数値を「1」に変更し、Enterで適用させましょう。

空のオブジェクトに新規スクリプトを追加する

  もう一度 Inspector にある、[ Add Component ] のボタンを押します。
  プルダウンメニューから New Script を選びます。(メニューリストの一番下にあります)
  Name 欄に NetworkControl と入力し、[Create and Add] ボタンを押します。
  以下のように、Inspector に NetworkControl が登録されます。


スクリプト編集の下準備

追加したスクリプトを開く

  Inspector に追加された「NetworkControl」を開きます。
  Inspector 内の Network Control の欄にある、以下の赤枠内をダブルクリックしてください。
  VisualStudio(またはMonoDevelop)が起動し、NetworkControl がテキストとして開きます。

using ディレクティブを登録する

  開いた NetworkControl の 3行目に、以下の一文を追加してください。
using MonobitEngine;
  スクリプト上で MUN 用のコードを自由に記述できるよう、 MonobitEngine の using ディレクティブを入れておきます。

MonobitEngine.MonoBehaviour を継承する

  NetworkControl の 5行目の「MonoBehaviour」について、「MonobitEngine.MonoBehaviour」に変更しましょう。
public class NetworkControl : MonobitEngine.MonoBehaviour {
  MonobitEngine.MonoBehaviour は UnityEngine.MonoBehaviour を継承していますので、
  本来の UnityEngine.MonoBehaviour と同じ感覚で使用することができます。
  加えて、MUNが提供する様々な機能を使用することもできます。

OnGUI() を作る

  NetworkControl の 13 行目の「Update()」について、「OnGUI()」に変更しましょう。
    ※ 出来れば 12 行目のコメントも変えておきましょう。
	// OnGUI is called for rendering and handling GUI events
	void OnGUI() {
  一般的な Unity プログラミング同様、MonoBehaviourを継承したクラス内で OnGUI() を定義します。
  継承するクラスが MonobitEngine.MonoBehaviour になっても、ここは変わりません。


サーバへの接続

サーバに接続し、デフォルトのロビーに入室する

  NetworkControl の 9 行目(Start() メソッド内)から、以下のコードを記述します。
		// デフォルトロビーへの自動入室を許可する
		MonobitNetwork.autoJoinLobby = true;

		// MUNサーバに接続する
		MonobitNetwork.ConnectServer("Bearpocalypse_v1.0");
  前章でも触れた復習項目ですが。

  MonobitNetowork.autoJoinLobby = true にすることで、自動的にデフォルトロビーに入室し、
  MonobitNetwork.ConnectServer でMUNサーバに接続します。

  MonobitNetwork.ConnectServer のパラメータは、前章と被らないようにしておくと、
  サーバ内でユーザーを分断してくれます。


ルームの作成

ルーム名を保持する変数を用意する

  NetworkControl の 7 行目に、以下の変数を宣言します。
		/** ルーム名. */
		private string roomName = "";
		
  GUIを使って入力するルーム名を保持する、string型の変数を用意します。

GUIを用いて、ルームを作成する

  NetworkControl の 21 行目(OnGUI()メソッド内)から、以下のコードを記述します。
		// デフォルトのボタンと被らないように、段下げを行なう。
		GUILayout.Space(24);
		
		// MUNサーバに接続している場合
		if( MonobitNetwork.isConnect )
		{
			// ルームに入室していない場合
			if( !MonobitNetwork.inRoom )
			{
				GUILayout.BeginHorizontal();

				// ルーム名の入力
				GUILayout.Label("RoomName : ");
				roomName = GUILayout.TextField(roomName, GUILayout.Width(200));

				// ボタン入力でルーム作成
				if ( GUILayout.Button("Create Room", GUILayout.Width(150)))
				{
					MonobitNetwork.CreateRoom(roomName);
				}

				GUILayout.EndHorizontal();

			}
		}
  これも前章で触れた復習項目ですが。

  それぞれ MonobitNetwork のプロパティ&メソッドを使って、以下の判定&処理を行ないます。
     ・ MonobitNetwork.isConnect
          → サーバに接続しているかどうかのフラグ。trueなら接続中。falseなら未接続or切断済み。
     ・ MonobitNetwork.inRoom
          → ルームに入室しているかどうかのフラグ。trueなら入室中。falseなら未入室or退室済み。
     ・ MonobitNetwork.CreateRoom
          → 指定したルーム名を持つルームを作成し、入室する関数。

  前章と同様、GUILayout については説明を割愛します。


選択式でのルーム入室

ルーム一覧を取得し、選択したルームに入室する

  NetworkControl の 44 行目から、以下のコードを記述します。
				// ルーム一覧から選択式で入室する
				foreach (RoomData room in MonobitNetwork.GetRoomData())
				{
					if (GUILayout.Button("Enter Room : " + room.name + "(" + room.playerCount + "/" + ((room.maxPlayers == 0) ? "-" : room.maxPlayers.ToString()) + ")"))
					{
						MonobitNetwork.JoinRoom(room.name);
					}
				}		
  これも前章で触れた復習項目ですが。

  MonobitNetwork.GetRoomData() メソッドは、現在入室しているロビー内に存在するルームについて、その一覧を取得する命令です。
  戻り値は RoomData[] 型で、上記の例では foreach() にて配列情報を1つずつ room で取得しています。

  RoomData クラスには、ルーム情報としていくつかのデータが含まれています。上記ではその一例として、以下の情報をボタン表示させています。
     ・ RoomData.name - ルーム名
     ・ RoomData.playerCount - 現在入室しているプレイヤー人数
     ・ RoomData.maxPlayers - 入室可能なプレイヤー最大人数(0の場合には無制限)

  また MonobitNetwork.JoinRoom() メソッドは、特定のルームに入室するための命令です。
  パラメータに、そのルームを特定する「ルーム名」を指定します。


ランダム式でのルーム入室

ロビー内のルームの中から、ランダムで選択したルームに入室する

  NetworkControl の 44 行目から、以下のコードを記述します。
				// 現在存在するルームからランダムに入室する
				if( GUILayout.Button("Join Random Room", GUILayout.Width(200)) )
				{
					MonobitNetwork.JoinRandomRoom();
				}
				
  MonobitNetwork.JoinRandomRoom() メソッドは、現在入室しているロビー内のルームの中から、
  任意のルームを選択して入室する制御です。


ルームからの退室

現在入室しているルームから退室する

  NetworkControl の 27 行目から、以下のコードを記述します。
			// ルームに入室している場合
			if( MonobitNetwork.inRoom )
			{
				// ボタン入力でルームから退室
				if (GUILayout.Button("Leave Room", GUILayout.Width(150)))
				{
					MonobitNetwork.LeaveRoom();
				}
			}
				
  これも前章で触れている復習項目ですが。
  MonobitNetwork.LeaveRoom() メソッドは、現在入室中のルームから退室するための命令です。


サーバからの切断

接続しているサーバから切断し、シーンをリセットする

  NetworkControl の 27 行目から、以下のコードを記述します。
			// ボタン入力でサーバから切断&シーンリセット
			if( GUILayout.Button("Disconnect", GUILayout.Width(150)))
			{
				// サーバから切断する
				MonobitNetwork.DisconnectServer();

				// シーンをリロードする
				Application.LoadLevel(Application.loadedLevelName);
			}
							
  MonobitNetwork.DisconnectServer() メソッドは、サーバから切断する命令です。
  切断後、再接続するためには、もう一度 MonobitNetwork.ConnectServer() メソッドのコールが必要です。

  MonobitNetwork.ConnectServer() メソッドは Start() メソッドで定義していますので、
  シーンをリロードすることにより再接続を可能にしています。
  (それ以外にも、ゲーム離脱後にシーンを初期化する意味を含めてリロードさせます。)


ここまでのNetworkControlの内容


  改めて触れますが、ここまでの NetworkControl.cs の内容は以下の通りです。
using UnityEngine;
using System.Collections;
using MonobitEngine;

public class NetworkControl : MonobitEngine.MonoBehaviour {

	/** ルーム名. */
	private string roomName = "";

	// Use this for initialization
	void Start () {
		// デフォルトロビーへの自動入室を許可する
		MonobitNetwork.autoJoinLobby = true;

		// MUNサーバに接続する
		MonobitNetwork.ConnectServer("Bearpocalypse_v1.0");
	}

	// OnGUI is called for rendering and handling GUI events
	void OnGUI() {
		// デフォルトのボタンと被らないように、段下げを行なう。
		GUILayout.Space(24);

		// MUNサーバに接続している場合
		if (MonobitNetwork.isConnect)
		{
			// ボタン入力でサーバから切断&シーンリセット
			if (GUILayout.Button("Disconnect", GUILayout.Width(150)))
			{
				// サーバから切断する
				MonobitNetwork.DisconnectServer();

				// シーンをリロードする
				Application.LoadLevel(Application.loadedLevelName);
			}

			// ルームに入室している場合
			if (MonobitNetwork.inRoom)
			{
				// ボタン入力でルームから退室
				if (GUILayout.Button("Leave Room", GUILayout.Width(150)))
				{
					MonobitNetwork.LeaveRoom();
				}
			}

			// ルームに入室していない場合
			if (!MonobitNetwork.inRoom)
			{
				GUILayout.BeginHorizontal();

				// ルーム名の入力
				GUILayout.Label("RoomName : ");
				roomName = GUILayout.TextField(roomName, GUILayout.Width(200));

				// ボタン入力でルーム作成
				if (GUILayout.Button("Create Room", GUILayout.Width(150)))
				{
					MonobitNetwork.CreateRoom(roomName);
				}

				GUILayout.EndHorizontal();

				// 現在存在するルームからランダムに入室する
				if (GUILayout.Button("Join Random Room", GUILayout.Width(200)))
				{
					MonobitNetwork.JoinRandomRoom();
				}

				// ルーム一覧から選択式で入室する
				foreach (RoomData room in MonobitNetwork.GetRoomData())
				{
					if (GUILayout.Button("Enter Room : " + room.name + "(" + room.playerCount + "/" + ((room.maxPlayers == 0) ? "-" : room.maxPlayers.ToString()) + ")"))
					{
						MonobitNetwork.JoinRoom(room.name);
					}
				}
			}
		}
	}
}



ここまでの内容について、一旦セーブする

シーンデータを保存する

  Unity のメニューから File > Save Scene を選択してください。