![見出し画像](https://assets.st-note.com/production/uploads/images/58671959/rectangle_large_type_2_02423a568c7b6ebb443b4dea44a2e129.jpg?width=800)
Unity Mirror 入門 (2) - NetworkManager
Unity Mirrorの「NetworkManager」の使い方をまとめました。
・Unity2019.4.18f1 LTS
・Mirror 44.0.2
前回
1. NetworkManager
「NetworkManager」は、サーバ・クライアント間の接続を管理を行うクラスです。
機能は、次のとおりです。
・接続管理
・スポーン管理
・シーン管理
・通信イベント
2. 接続管理
「Mirror」を実装したアプリは、「クライアント」「サーバー」「ホスト」の3つのモードを選択する必要があります。
「NetworkManagerHUD」で、この3つのモードを選択するUIを提供しますが、独自のUIを作成している場合は、「NetworkManager」経由で操作する必要があります。
・NetworkManager#StartHost() : ホスト接続。
・NetworkManager#StartClient() : クライアント接続。
・NetworkManager#StartServer() : サーバー接続。
・NetworkManager#StopHost() : ホスト停止。
・NetworkManager#StopClient() : クライアント停止。
・NetworkManager#StopServer() : サーバー停止。
クライアントの接続先を指定するには、NetworkManager#networkAddressにIP(またはlocalhost)を指定します。
3. スポーン管理
マルチプレイヤーゲーム内でゲームオブジェクトを作成する場合、サーバーでゲームオブジェクトを「スポーン」する必要があります。これによって、接続されたクライアントでのゲームオブジェクトの作成と同期が行われます。
「プレイヤー」およびその他のスポーンするオブジェクトのプレハブは、「NetworkManager」に登録しておく必要があります。
![画像3](https://assets.st-note.com/production/uploads/images/58731056/picture_pc_879c766b1f341d2c0d9151c4f4b71e35.png?width=800)
4. シーン管理
マルチプレイヤーゲーム内には複数のシーンがあります。「Mirror」は、シーンの状態とシーンの遷移を自動的に管理するように設計されています。
◎ Offline SceneとOnline Scene
「NetworkManager」には、「Offline Scene」と「Online Scene」の2つのスロットがあります。これらのスロットにシーンをドラッグすると、ネットワーク化されたシーン管理が有効になります。
![画像4](https://assets.st-note.com/production/uploads/images/58731688/picture_pc_086693521b9b4e1287fed2e7af964348.png?width=800)
◎ ServerChangeScene()
ServerChangeScene()を呼び出すことで、ゲーム中にシーンを変更することもできます。
5. 通信イベント
NetworkManagerを継承して、メソッドをオーバーライドすることで、通信イベントを受信できるようになります。
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Mirror;
public class CustomNetworkManager : NetworkManager
{
//====================
// ホスト・クライアント・サーバーの開始・停止
//====================
// ホストの開始時に呼ばれる
public override void OnStartHost()
{
base.OnStartHost();
print("OnStartHost");
}
// クライアントの開始時に呼ばれる
public override void OnStartClient()
{
base.OnStartClient();
print("OnStartClient");
}
// サーバーの開始時に呼ばれる
public override void OnStartServer()
{
base.OnStartServer();
print("OnStartServer");
}
// ホストの停止時に呼ばれる
public override void OnStopHost()
{
base.OnStopHost();
print("OnStopHost");
}
// クライアントの停止時に呼ばれる
public override void OnStopClient()
{
base.OnStopClient();
print("OnStopClient");
}
// サーバーの停止時に呼ばれる
public override void OnStopServer()
{
base.OnStopServer();
print("OnStopServer");
}
//====================
// クライアント
//====================
// クライアントの接続時に呼ばれる
public override void OnClientConnect(NetworkConnection conn)
{
base.OnClientConnect(conn);
print("OnClientConnect : "+conn.connectionId);
}
// クライアントの切断時に呼ばれる
public override void OnClientDisconnect(NetworkConnection conn)
{
base.OnClientDisconnect(conn);
print("OnClientDisconnect : "+conn.connectionId);
}
// クライアントのエラー時に呼ばれる
public override void OnClientError(Exception exception)
{
base.OnClientError(exception);
print("OnClientError : "+exception);
}
// クライアントの未準備時に呼ばれる
public override void OnClientNotReady(NetworkConnection conn)
{
base.OnClientNotReady(conn);
print("OnClientDisconnect : "+conn.connectionId);
}
// クライアントのシーン読み込み完了時に呼ばれる
public override void OnClientChangeScene(string sceneName, SceneOperation sceneOperation, bool customHandlin)
{
base.OnClientChangeScene(sceneName, sceneOperation, customHandlin);
print("OnClientChangeScene : "+sceneName);
}
//====================
// サーバー
//====================
// サーバーの接続時に呼ばれる
public override void OnServerConnect(NetworkConnection conn)
{
base.OnServerConnect(conn);
print("OnServerConnect : "+conn.connectionId);
}
// サーバーの切断時に呼ばれる
public override void OnServerDisconnect(NetworkConnection conn)
{
base.OnServerDisconnect(conn);
print("OnServerDisconnect : "+conn.connectionId);
}
// サーバーの準備完了時に呼ばれる
public override void OnServerReady(NetworkConnection conn)
{
base.OnServerReady(conn);
print("OnServerReady : "+conn.connectionId);
}
// サーバーのエラー時に呼ばれる
public override void OnServerError(NetworkConnection conn, Exception exception)
{
base.OnServerError(conn, exception);
print("OnServerError : "+conn.connectionId+","+exception);
}
// サーバーのプレイヤー追加時に呼ばれる
public override void OnServerAddPlayer(NetworkConnection conn)
{
base.OnServerAddPlayer(conn);
print("OnServerAddPlayer : "+conn.connectionId);
}
// サーバーのシーン読み込み完了時に呼ばれる
public override void OnServerChangeScene(string sceneName)
{
base.OnServerChangeScene(sceneName);
print("OnServerChangeScene : "+sceneName);
}
}
メソッドは、次のとおりです。
◎ ホスト・クライアント・サーバーの開始・停止
・void OnStartHost() : ホストの開始時
・void OnStartClient() : クライアントの開始時
・void OnStartServer() : サーバーの開始時
・void OnStopHost() : ホストの停止時
・void OnStopClient() : クライアントの停止時
・void OnStopServer() : サーバーの停止時
◎ クライアント
・void OnClientConnect(NetworkConnection conn) : クライアントの接続時
・void OnClientDisconnect(NetworkConnection conn) : クライアントの切断時
・void OnClientError(Exception exception) : クライアントの例外時
・void OnClientNotReady(NetworkConnection conn) : クライアントの未準備時
・void OnClientChangeScene(string sceneName, SceneOperation sceneOperation, bool customHandlin) : クライアントのシーン読み込み時
◎ サーバー
・void OnServerConnect(NetworkConnection conn) : サーバーの接続時
・void OnServerDisconnect(NetworkConnection conn) : サーバーの切断時
・void OnServerReady(NetworkConnection conn) : サーバーの準備完了時
・void OnServerError(NetworkConnection conn, Exception exception) : サーバーのエラー時
・void OnServerAddPlayer(NetworkConnection conn) : サーバーのプレイヤー追加時
・void OnServerChangeScene(string sceneName) : サーバーのシーン読み込み完了時
6. 独自UIの作成
「クライアント」「サーバー」「ホスト」を選択する独自UIを作成します。
(1) UIの準備
ボタン3つを配置します。
![画像2](https://assets.st-note.com/production/uploads/images/58672244/picture_pc_566593c1deed72dd2b1f32cc0dd820d8.png?width=800)
(2) 「NetworkManager」の「NetworkManagerHUD」を削除。
(3) 「NetworkManager」に新規スクリプト「NetworkManagerUI」を追加。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Mirror;
public class NetworkManagerUI : MonoBehaviour
{
public Canvas canvas;
// ホストボタン押下時に呼ばれる
public void OnHostButton()
{
GetComponent<NetworkManager>().StartHost();
canvas.gameObject.SetActive(false);
}
// クライアントボタン押下時に呼ばれる
public void OnClientButton()
{
GetComponent<NetworkManager>().networkAddress = "localhost"; // IP指定
GetComponent<NetworkManager>().StartClient();
canvas.gameObject.SetActive(false);
}
// セーバーボタン押下時に呼ばれる
public void OnServerButton()
{
GetComponent<NetworkManager>().StartServer();
canvas.gameObject.SetActive(false);
}
}
(4) 3つのボタンイベントとcanvasの参照を関連付ける。
![画像2](https://assets.st-note.com/production/uploads/images/58676611/picture_pc_a9dae95e4121fe9b351c18802236d088.png?width=800)
次回
この記事が気に入ったらサポートをしてみませんか?