Unity Mirror サンプル

Unity Mirror サンプルプロジェクト へようこそ! このプロジェクトでは、Unity Transport Package (UTP)RelayMirror Networking API と共に使用する方法を示します。

  • Unity Transport Package (UTP) は、信頼性、順序付け、断片化などのオプション機能を備えた、UDP ソケット上に接続ベースの抽象化レイヤーを提供する低レベルのネットワークライブラリです。
  • Relay は、参加コードスタイルのワークフローを使用して、専用ゲームサーバーやピアツーピア通信を必要とせずにプレイヤー同士を安全かつ簡単に接続できる Unity のサービスです。
  • Mirror は、Unity プラットフォーム用の高レベルなネットワークライブラリです。

UTP のファイルは Assets/UTPTransport ディレクトリ、Mirror のファイルは Assets/Mirror ディレクトリにあります。

ノート: この サンプルプロジェクト では、YouTube 上の Shrine の Mirror Networking シリーズ からのコードと情報を使用しています。

要件と制限事項

Unity Mirror サンプルには以下の要件があります。

  • サポートされているバージョンの Unity エディター。このサンプルプロジェクトでは、バージョン 2020.3 以降がサポートされています。
  • Unity Gaming Services (UGS) アカウント
  • Unity Services
  • Unity Relay
  • Unity Transport Package (Relay に付属)
  • Unity Jobs
  • Unity Authentication Service (UAS)
  • Mirror Networking API v67.1.0

制限事項

このサンプルは、そのままでは Game Server Hosting で機能しません。ただし、Game Server Hosting (GSH) で機能するようにサンプルを適応させることはできます。GSH を使用するためにサンプルを適応させたい場合は、Relay が GSH と同じスペースを占めるピアツーピア模倣ソリューションであることに留意してください。そのため、Relay と GSH を一緒に使用することは意味がありません。

前提条件

先に進む前に、サンプルプロジェクトを使用するための前提条件をすべて完了していることを確認してください。

サンプルのアーキテクチャ

Unity Mirror サンプルプロジェクトには、2 つの異なるコンポーネントがあります。

ゲームクライアントコンポーネントとゲームサーバーコンポーネントは、Unity と Mirror Networking API を使用します。

ゲームクライアント

ゲームクライアントは、プレイヤーがゲームサーバーとバックエンドサービスに接続するために自分のマシン上でローカルに実行する実行ファイルです。ゲームクライアントは Relay ありでも Relay なしでも実行できます。

ゲームサーバー

ゲームサーバーは、ゲームサーバープロセスを実行する実行可能ビルドです。

ゲームサーバー実行ファイルは (開発用に) ローカルで実行することも、本番用に Game Server Hosting などのサービスでホストすることもできます。

ノート: Relay サービスから見ると、ゲームサーバーはホストプレイヤーのゲームクライアントです。

ガイド

以下のセクションでは、サンプルプロジェクトを操作し、テストし、適応させる方法について説明します。

Asset Store から Mirror サンプルをインストールする

サンプルプロジェクトの UTP トランスポートの実装を自分のプロジェクトにインストールするには、以下のステップを実行します。GitHub 上のリポジトリ から、サンプルプロジェクトのコードを入手することもできます。

  1. Asset Store 内の Mirror のページ に移動します。
  2. Add Mirror to My Assets (Mirror をマイアセットに追加する) を選択します。
  3. Unity エディターを起動します。
    1. Package Manager (パッケージマネージャー) を使用して Mirror をインポートします。

      1. Window (ウィンドウ) > Package Manager (パッケージマネージャー) > Packages: My Assets (パッケージ: マイアセット) > Mirror > Download/Import (ダウンロード/インポート) を選択します。
    2. Package Manager (パッケージマネージャー) を使用して Relay をインポートします。

      1. Window (ウィンドウ) > Package Manager (パッケージマネージャー) > Add (追加) > Add package from git URL... (GIT URL からパッケージを加える...) > "com.unity.services.relay@1.0.4" を選択します。
    3. Package Manager (パッケージマネージャー) を使用して Jobs をインポートします。

      1. Window (ウィンドウ) > Package Manager (パッケージマネージャー) > Add (追加) > Add package from git URL... (GIT URL からパッケージを加える...) > "com.unity.jobs" を選択します。
    4. サンプルプロジェクトから自分のプロジェクトに Assets\UTPTransport ディレクトリをコピーします。

    5. Mirror.NetworkManager コンポーネントを自分の GameObject にアタッチします。

    6. UTP.UtpTransport コンポーネントを自分の GameObject にアタッチします。

    7. UTP.UtpTransport コンポーネントを Mirror.NetworkManager コンポーネントの Transport フィールドに割り当てます。

    8. Mirror によって自分のゲームオブジェクトに自動的にアタッチされた、kcp2k.KcpTransport コンポーネントを削除します。

サンプルプロジェクトをテストする

警告: サンプルプロジェクトをテストする前に、Unity Dashboard で Relay を有効にして設定済みであることを確認してください。

テスト目的でサンプルプロジェクトの 2 つのインスタンスを起動するには、以下のステップを実行します。

  1. Unity エディターでサンプルプロジェクトを開きます。このプロジェクトでは、Unity 2020.3 以降がサポートされています。
  2. エディターのドロップダウンから、ParallelSync > Clones Manager (クローンマネージャー) を選択します。ParallelSync を使用すると、同じプロジェクトの複数のエディターインスタンスを起動できます。
  3. Add new clone (新しいクローンを追加) を選択します。
  4. クローンを作成したら、Open in New Editor (新しいエディターで開く) を選択します。
  5. 両方のエディターインスタンスで Play (再生) を選択します。
  6. 両方のエディターインスタンスで Auth Login (ログイン認証) を選択します。これにより、Relay 用の Unity Authentication Service (UAS) で認証を行います。

Relay 用の UAS で両方のエディターインスタンスの認証を行ったら、サンプルプロジェクトの UTP トランスポートと Relay 機能をテストできます。

サンプルの GUI を使用して、以下の機能をテストします。

  1. Standard Host (標準ホスト) を選択して、UTP トランスポートを使用してサーバーを起動します。
  2. Client (without Relay) (クライアント (Relay なし)) を選択して、UTP トランスポートを使用してサーバーに接続します。
  3. Relay Host (Relay ホスト) を選択して、Relay サーバーの 割り当て を行います。
  4. Client (with Relay) (クライアント (Relay あり)) を選択して、Relay サーバーに接続します。

ノート: 各コンポーネントをテストするときは、正しいボタンを使用していることを確認してください。

Linux 用にクロスコンパイルする

Unity エディターで、ゲームクライアント実行ファイルとゲームサーバー実行ファイルの両方を Linux 用にクロスコンパイルできます。

  1. Unity Hub を起動し、Installs (インストール) を選択します。
  2. バージョン 2020.3.24f1 の横の歯車を選択します。
  3. Add modules (モジュールを加える) を選択します。
  4. Linux Build Support (IL2CPP and Mono) (Linux Build Support (IL2CPP および Mono)) モジュールを選択し、Install (インストール) を選択します。

Linux Build Support モジュールのインストールが完了したら、Unity エディター内で Linux をビルドオプションとして選択します。

  1. Unity エディターを起動します。
  2. File (ファイル) > Build Settings (ビルド設定) を選択します。
  3. ターゲットプラットフォームとして Linux を選択します。
  4. サーバービルドをパッケージ化する場合は、Server build (サーバービルド) を選択します。それ以外の場合は、Build (ビルド) を選択し、ビルド場所を選択します。
ゲームクライアントを実行する

ゲームクライアントコンポーネントは、スタンドアロンアプリケーションとしてローカルに実行することも、Unity エディターから実行することもできます。

ゲームクライアントをスタンドアロンアプリケーションとして実行するには、ファイルエクスプローラーまたはコマンドラインインターフェースからゲームクライアント実行ファイルを選択します。

Unity エディターからゲームクライアントを実行するには、以下のようにします。

  1. Unity エディター (バージョン 2020.3 以降) で、Unity Mirror サンプルプロジェクトを開きます。
  2. Play (再生) を選択します。

ノート: Unity Mirror サンプルプロジェクトを初めて開いたときは、Unity がすべてのファイルとパッケージをインポートするのに数分かかる場合があります。

ゲームサーバーを実行する

ゲームサーバーコンポーネントは、コマンドラインインターフェースで -server 引数を使用してローカルで実行できます。

ゲームクライアントとゲームサーバーを一緒に実行する

ゲームクライアント実行ファイルとゲームサーバー実行ファイルを、一方をスタンドアロンアプリケーションとして実行し、もう一方を Unity エディターから実行することで、ローカルで実行できます。

ノート: ゲームクライアントとゲームサーバーを実行する前に、サーバーとクライアントの両方のビルドを作成する必要があります。

例えば、ゲームサーバーをスタンドアロンアプリケーションとして実行し、ゲームクライアントを Unity エディターから実行するには、以下のようにします。

  1. コマンドラインインターフェースからゲームサーバーを起動します。
  2. -log 引数を付加して、ログをリアルタイムで表示します。
  3. Unity エディターで、Start Client (クライアントを起動) を選択します。

ノート: ゲームサーバーのデフォルトポートは 7777 です。ポート番号を変更するには、-port 引数を使用します。

サンプルプロジェクトを適応させる

Unity Mirror サンプルプロジェクト では、以下のタスクを実行するためのサンプルコードが提供されています。

  1. Mirror Network Manager を初期化する
  2. Relay 機能を追加する
  3. UTP トランスポート機能を追加する
  4. カスタム Network Manager を使用してすべてを一緒にまとめる
  5. テスト用に GUI を公開する
Mirror Network Manager を初期化する

Assets/Mirror/Runtime/NetworkManager.csNetworkManager クラスは、Mirror Network Manager のシングルトンインスタンスです。Mirror Network Manager コンポーネントは、ゲームの状態管理、スポーン管理、シーン管理など、マルチプレイヤーゲームのネットワーク面を管理するために使用します。

Relay 機能を追加する

Assets/UTPTransport/RelayNetworkManager.csRelayNetworkManager クラスは、NetworkManager クラスを Relay 機能で拡張します。これは、以下を行う方法を示します。

UTP 機能を追加する

Assets/UTPTransport/UtpTransport.csUtpTransport クラスは、UTP および Relay と互換性のある Mirror.Transport のインスタンスです。これは、以下を行う方法を示します。

  • Relay 参加コードを使用してクライアントを設定する
  • 参加コードから 割り当て を取得する
  • Relay 地域を取得する
  • Relay サーバーを割り当てる
カスタム Network Manager を作成する

Assets/Scripts/MyNetworkManager.csMyNetworkManager クラスは、Mirror 用の UTP トランスポートと Relay サービスの機能を一緒にまとめる RelayNetworkManager のインスタンスです。

ユーザーインターフェースを公開する

Assets/Scripts/MenuUI.csMenuUI クラスは、サンプルを動作させる UI を表示する役割を担います。サーバーを起動してクライアントを接続するために、MyNetworkManager とのインターフェースとなります。

Mirror 用の UTP トランスポートを自分のプロジェクトで使用する

このサンプルには、Mirror 用の Unity Transport Package (UTP) トランスポート が含まれています。以下のセクションの指示に従うことで、このサンプルのコードを自分のプロジェクトで使用できます。

ノート: 先に進む前に、要件と制限事項 のセクションを参照してください。

既存のトランスポートから UTP トランスポートに移行する

既に Mirror を使用していて、いずれかのビルトインのトランスポートから UTP トランスポートに移行したい場合は、以下のステップを実行します。

  1. Unity エディターを起動します。
  2. Mirror.NetworkManager コンポーネントを含んでいるシーンを見つけて開きます。
  3. UTP.UtpTransport コンポーネントを自分の GameObject にアタッチします。
  4. UTP.UtpTransport コンポーネントを Mirror.NetworkManager コンポーネントの Transport フィールドに割り当てます。
  5. 自分の GameObject から既存の Mirror.Transport コンポーネントを削除します。
  6. ポートやログの冗長性など、UTP.UtpTransport コンポーネントのパラメーターを満足のいくように設定します。
Relay と UTP を使用する

Relay を使用したい場合は、Mirror.NetworkManager の代わりに UTP.RelayNetworkManager を使用する必要があります。UTP.RelayNetworkManager は、Mirror.NetworkManager を継承し、Relay サービスとの相互作用のための機能を追加したものであるためです。

Relay を使用する前に、Unity Authentication Service (UAS) で認証を行う必要があります。独自の認証サービスを使用する場合でも、Relay サービスでは認証が必要となります。

以下のコードスニペットは、Unity Authentication Service で認証を行う方法を示しています。

try
{
   await UnityServices.InitializeAsync();
   await AuthenticationService.Instance.SignInAnonymouslyAsync();
   Debug.Log("Logged into Unity, player ID: " + AuthenticationService.Instance.PlayerId);
}
catch (Exception e)
{
   Debug.LogError(e);
}

認証を行った後は、UTP.RelayNetworkManager を使用して、Relay サーバーを割り当てたり、参加コードを使用して Relay サーバーに参加したりできます。

サポートを受ける

開始時に問題が発生した場合は、サポートを受けることができます。Relay サポートポータル に移動し、チケットを送信してください。必ず、チケットカテゴリとして Networking Package (ネットワークパッケージ) > Mirror を選択してください。