見出し画像

Unity Mirror 入門 (1) - 事始め

Unity Mirrorの使い方をまとめました。

・Unity2019.4.18f1 LTS
・Mirror 44.0.2

1. Mirror

「Mirror」は、Unityゲームでマルチプレイヤー機能を実装するためのシステムです。

2. Mirrorの用語

◎ サーバーとクライアント
Mirrorを実装したアプリは、「サーバー」「クライアント」のいずれかになります。

◎ サーバー
復数のプレーヤーが一緒にプレイしたい時に接続するインスタンスです。スコアなどのゲームの情報を管理し、クライアントに伝えます。

◎ クライアント
異なるコンピュータからサーバーに接続するインスタンスです。ローカルネットワーク経由またはオンラインで接続します。

サーバーは、「専用サーバー」「ホストサーバー」のいずれかになります

◎ 専用サーバー
「サーバー」としてのみ機能するインスタンスです。

◎ ホストサーバー
「サーバー」と「クライアント」の両方として機能するインスタンスです。

◎ ローカルクライアントとリモートクライアント
クライアントは、「ローカルクライアント」「リモートクライアント」のいずれかになります。

◎ ローカルクライアント
「ホストサーバー」で実行されるクライアントです。「ホストサーバー」では、「ローカルクライアント」と「サーバー」の両方が同じコンピュータで実行されます。 

◎リモートクライアント
「ホストサーバー」外で実行されるクライアントです。異なるコンピュータ上で実行され、「ホストサーバー」に接続します。

画像1

◎ インスタンス化とスポーン

◎ インスタンス化
シングルプレイヤーゲーム内でゲームオブジェクトを作成する場合、「インスタンス化」(GameObject.Instantiate()を行います。

◎スポーン
マルチプレイヤーゲーム内でゲームオブジェクトを作成する場合、サーバーがゲームオブジェクトを「スポーン」する必要があります。これによって、接続されたクライアントでゲームオブジェクトの作成がトリガーされ、ゲームオブジェクトの設定に基づいて状態を同期します。

◎ プレイヤーとローカルプレイヤー

◎ プレイヤー
新しいクライアントがサーバーに接続すると、1つのクライアントごとに1つの「プレイヤー」と呼ばれるゲームオブジェクトが生成されます。

◎ ローカルプレイヤー

自身の「プレイヤー」を「ローカルプレイヤー」と呼びます。ユーザーが操作できるのは、ローカルプレイヤーのみになります。

3. 開発環境の準備

開発環境の準備の手順は、次のとおりです。

(1) Unityの準備。
Unity2019 LTS推奨で、全ての最新のLTSバージョンでも機能します。

(2) AssetStoreから「Mirror」をインポート。

画像2

4. NetworkManagerの準備

はじめに、「NetworkManager」を準備します。

(1) 空のGameObjectを作成し、「NetworkManager」と名前を指定。
(2) 「NetworkManager」に「Add Component」で「NetworkManager」と「NetworkManagerHUD

画像4

・NetworkManager : サーバ・クライアント間の接続を管理。
・NetworkManagerHUD : ホスト・クライアント・サーバを選択する簡易UI。

この時点で実行すると、ホスト・クライアント・サーバを選択する簡易UIが表示されます。

5. プレイヤーの準備

次に、「プレイヤー」を準備します。

(1) 「Sphere」を追加し、Add Component」で「Rigidbody」を追加し、「Use Gravity」のチェックを外す。
(2) 「Sphere」に「Add Component」で「NetworkIdentity」と「NetworkTransform」を追加。

画像5

・NetworkIdentity : サーバー・クライアント間で同期するオブジェクトのID。
・NetworkTransform : サーバー・クライアント間でTransformを同期。

(3) 「Sphere」に「Add Component」で新規スクリプト「PlayerControl」を追加

using UnityEngine;
using Mirror;

public class PlayerControl : NetworkBehaviour
{
    // 定期更新時に呼ばれる
    void FixedUpdate()
    {
        // ローカルプレイヤーの時
        if (isLocalPlayer) {
            // 操作
            float x = Input.GetAxis("Horizontal");
            float z = Input.GetAxis("Vertical");
            CmdMoveSphere(x, z);
        }
    }

    // 球の移動
    [Command]
    void CmdMoveSphere(float x, float z) 
    {
        Vector3 v = new Vector3(x, 0, z) * 5f;
        GetComponent<Rigidbody>().AddForce(v);
    }
}

◎ NetworkBehaviour
サーバー・クライアント間で同期するオブジェクトが継承するクラスです。

◎ ローカルプレイヤーかどうか

ローカルプレイヤーかどうかは、以下で確認します。

・isLocalPlayer : ローカルプレイヤーかどうか
・isServer : サーバーかどうか
・isClient : クライアントかどうか

◎ コマンド
NetworkBehaviourの「Cmd」ではじまるメソッドに[Command]タグを付加することで、クライアントから呼ばれた時、サーバー上で実行されるメソッドとして指定できます。

処理の流れは、次のようになります。

(1) ローカルプレイヤーが、[Command]メソッドを呼び、サーバーのプレイヤーを操作。
(2) サーバーのプレイヤーの状態がクライアントのプレイヤーに同期される。

[Command]メソッドで渡せる引数のデータ型は、次のとおりです。

(4) 「Sphere」をProjectウィンドウにドラッグ&ドロップしてプレハブ化し、Hierarchyウィンドウの「Shape」を削除。
(5) 「NetworkManager」の「Player Prefab」に「Sphere」プレハブを設定。

画像6

6. 実行

実行手順は、次のとおりです。

(1) アプリをビルドして実行し、「Host」ボタンを押す。
(2) Unityエディタを実行し、「Client」ボタンを押す。

方向キーで球を移動させ、位置が同期することを確認します。

画像3

次回



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