見出し画像

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

4. シーン管理

マルチプレイヤーゲーム内には複数のシーンがあります。「Mirror」は、シーンの状態とシーンの遷移を自動的に管理するように設計されています。

◎ Offline SceneとOnline Scene
「NetworkManager」には、「Offline Scene」と「Online Scene」の2つのスロットがあります。これらのスロットにシーンをドラッグすると、ネットワーク化されたシーン管理が有効になります。

画像4

◎ 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

(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

次回




この記事が気に入ったらサポートをしてみませんか?