![見出し画像](https://assets.st-note.com/production/uploads/images/58652866/rectangle_large_type_2_148a6d02254c1ed44c505a2924410d09.jpg?width=800)
Unity Mirror 入門 (1) - 事始め
Unity Mirrorの使い方をまとめました。
・Unity2019.4.18f1 LTS
・Mirror 44.0.2
1. Mirror
「Mirror」は、Unityゲームでマルチプレイヤー機能を実装するためのシステムです。
2. Mirrorの用語
◎ サーバーとクライアント
Mirrorを実装したアプリは、「サーバー」「クライアント」のいずれかになります。
◎ サーバー
復数のプレーヤーが一緒にプレイしたい時に接続するインスタンスです。スコアなどのゲームの情報を管理し、クライアントに伝えます。
◎ クライアント
異なるコンピュータからサーバーに接続するインスタンスです。ローカルネットワーク経由またはオンラインで接続します。
サーバーは、「専用サーバー」「ホストサーバー」のいずれかになります
◎ 専用サーバー
「サーバー」としてのみ機能するインスタンスです。
◎ ホストサーバー
「サーバー」と「クライアント」の両方として機能するインスタンスです。
◎ ローカルクライアントとリモートクライアント
クライアントは、「ローカルクライアント」「リモートクライアント」のいずれかになります。
◎ ローカルクライアント
「ホストサーバー」で実行されるクライアントです。「ホストサーバー」では、「ローカルクライアント」と「サーバー」の両方が同じコンピュータで実行されます。
◎リモートクライアント
「ホストサーバー」外で実行されるクライアントです。異なるコンピュータ上で実行され、「ホストサーバー」に接続します。
![画像1](https://assets.st-note.com/production/uploads/images/58653432/picture_pc_767fcf820503a772ccfa605941b7ca62.png?width=800)
◎ インスタンス化とスポーン
◎ インスタンス化
シングルプレイヤーゲーム内でゲームオブジェクトを作成する場合、「インスタンス化」(GameObject.Instantiate())を行います。
◎スポーン
マルチプレイヤーゲーム内でゲームオブジェクトを作成する場合、サーバーがゲームオブジェクトを「スポーン」する必要があります。これによって、接続されたクライアントでゲームオブジェクトの作成がトリガーされ、ゲームオブジェクトの設定に基づいて状態を同期します。
◎ プレイヤーとローカルプレイヤー
◎ プレイヤー
新しいクライアントがサーバーに接続すると、1つのクライアントごとに1つの「プレイヤー」と呼ばれるゲームオブジェクトが生成されます。
◎ ローカルプレイヤー
自身の「プレイヤー」を「ローカルプレイヤー」と呼びます。ユーザーが操作できるのは、ローカルプレイヤーのみになります。
3. 開発環境の準備
開発環境の準備の手順は、次のとおりです。
(1) Unityの準備。
Unity2019 LTS推奨で、全ての最新のLTSバージョンでも機能します。
(2) AssetStoreから「Mirror」をインポート。
![画像2](https://assets.st-note.com/production/uploads/images/58657317/picture_pc_2530ff3c10131903997df1e1b3c05a8a.png?width=800)
4. NetworkManagerの準備
はじめに、「NetworkManager」を準備します。
(1) 空のGameObjectを作成し、「NetworkManager」と名前を指定。
(2) 「NetworkManager」に「Add Component」で「NetworkManager」と「NetworkManagerHUD」
![画像4](https://assets.st-note.com/production/uploads/images/58665271/picture_pc_3f230a64d8c68a92e98a2004b20dd31e.png?width=800)
・NetworkManager : サーバ・クライアント間の接続を管理。
・NetworkManagerHUD : ホスト・クライアント・サーバを選択する簡易UI。
この時点で実行すると、ホスト・クライアント・サーバを選択する簡易UIが表示されます。
5. プレイヤーの準備
次に、「プレイヤー」を準備します。
(1) 「Sphere」を追加し、Add Component」で「Rigidbody」を追加し、「Use Gravity」のチェックを外す。
(2) 「Sphere」に「Add Component」で「NetworkIdentity」と「NetworkTransform」を追加。
![画像5](https://assets.st-note.com/production/uploads/images/58665520/picture_pc_10a89bda1f53a38219558e1e655a7191.png?width=800)
・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](https://assets.st-note.com/production/uploads/images/58665995/picture_pc_17cff59977c62dedc489ab33ccee3dba.png?width=800)
6. 実行
実行手順は、次のとおりです。
(1) アプリをビルドして実行し、「Host」ボタンを押す。
(2) Unityエディタを実行し、「Client」ボタンを押す。
方向キーで球を移動させ、位置が同期することを確認します。
![画像3](https://assets.st-note.com/production/uploads/images/58665152/picture_pc_80ebf386fa79bbb044c0ac9e6e347ecb.png?width=800)
次回
この記事が気に入ったらサポートをしてみませんか?