サーバへの接続から切断までの一連の流れを作る
目次
概要
空のオブジェクトの作成とスクリプトの登録
スクリプト編集の下準備
スクリプトの編集
サーバへの接続
ルームの作成
選択式でのルーム入室
ランダム式でのルーム入室
ルームからの退室
サーバからの切断
ここまでの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 を選択してください。
