Relay と Netcode for GameObjects (NGO) の使用

Relay は、GameObject および MonoBehavior ワークフローにネットワーキング機能を提供する Unity パッケージである、Netcode for GameObjects (NGO) とシームレスに連携します。NGO フレームワークは、Unity Transport Package (UTP) を含む多くの低レベルトランスポートとも良好に連携します。

ノート: バインディングなどの Relay サーバー を通じて行われるインタラクションは、UTPNGO などのネットワークソリューションを使用して処理されます。推奨されるベストプラクティスは、Relay と NGO の併用ですが、他のネットコードライブラリ (Mirror Networking API など) を使用することもできます。Relay を UTP やその他のネットコードライブラリと併用する方法については、Relay と UTP を参照してください。

Relay SDK を設定する

Relay と NGO を併用する前に、Unity プロジェクトを Unity 用に設定する必要があります。Relay の使用を開始する を参照してください。Relay サービスを有効にし、Unity エディターを通じて Unity プロジェクト ID をリンクしたら、要件をインポートし、NetworkManager を設定し、プレイヤーを Unity Services で認証して、Relay SDK での作業を開始できます。

Relay SDK を設定した後は、ゲームクライアントを設定して、Relay ゲームセッションに ホストプレイヤーとして、また 接続プレイヤーとして 参加するための必要なタスクを実行できます。

ノート: ドキュメント内のサンプルでは、NGO 1.1.0 を使用しています。

要件をインポートする

Relay サービスを使用する前に、Relay SDK と UTP、およびその他の名前空間をインポートする必要があります。パッケージと SDK のダウンロードセンターから生成したコードスニペットを使用してください。

  1. Unity Dashboard にサインインします。

  2. パッケージと SDK のダウンロードセンター に移動します。

  3. 以下のパッケージ選択します。

    • Relay

    • Netcode for GameObjects

  4. Generate Code Snippet (コードスニペットを生成) を選択し、その後の指示に従います。

以下のコードサンプルは、要件のインポートの例を示したものです。

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using UnityEngine;
using Unity.Services.Core;
using Unity.Services.Authentication;
using Unity.Services.Relay;
using Unity.Services.Relay.Http;
using Unity.Services.Relay.Models;
using Unity.Netcode;
using Unity.Netcode.Transports.UTP;
using Unity.Networking.Transport;
using Unity.Networking.Transport.Relay;
using NetworkEvent = Unity.Networking.Transport.NetworkEvent;

NetworkManager の設定

Unity Dashboard からパッケージをインストールしたら、Unity エディターにある自分のプロジェクトで、NetworkManager を Relay および NGO 用に設定します。

ノート: 足りないオプションがある場合は、Unity Dashboard のインストールパッケージにリストされているすべてのパッケージをインストールしたことを確認してください。

  1. 新しい ゲームオブジェクト をシーンに追加します。
  2. NetworkManager MonoBehavior を追加します。
  3. MonoBehavior Properties (MonoBehavior のプロパティ) で、UnityTransport トランスポートを選択します。UnityTransport を選択すると、コンポーネントリストの一番下に Unity Transport (script) という MonoBehavior が表示されます。
  4. 新しいコンポーネントの Protocol Type (プロトコルタイプ) を Relay Unity Transport に設定します。

変数とユーティリティ関数を設定する

最大接続数や参加コードなど、いくつかの変数の初期化も行う必要があります。

const int m_MaxConnections = 4;

		public string RelayJoinCode;

プレイヤーの認証を行う

ホストプレイヤーと接続プレイヤーの両方の認証を行う必要があります。プレイヤーの認証を行う最も簡単な方法は、Authentication サービスの SignInAnonymouslyAsync() メソッドを使用する方法です。匿名ログインの使用方法プラットフォーム固有のサインインの使用方法 を参照してください。

詳細については、Unity Authentication の概要Unity Authentication のユースケース を参照してください。

async void Example_AuthenticatingAPlayer()
{
    try
    {
        await UnityServices.InitializeAsync();
        await AuthenticationService.Instance.SignInAnonymouslyAsync();
        var playerID = AuthenticationService.Instance.PlayerId;
    }
    catch (Exception e)
    {
        Debug.Log(e);
    }
}

ホストプレイヤー

ゲームクライアントがホストプレイヤーとして機能する場合、そのゲームクライアントは、割り当ての作成、参加コードのリクエスト、接続の種類の設定、Relay サーバーをバインドして参加プレイヤーからのリクエストをリッスンするための NetworkDriver のシングルトンインスタンスの作成を行える必要があります。

警告: SetRelayServerData または SetRelayClientData を通じて提供された情報と、割り当てから取得した情報が一致しない場合は、Relay サーバーに接続できません。例えば、isSecure パラメーターが一致しない場合は、"Failed to connect to server (サーバーに接続できません)" というエラーメッセージが表示されます。

このエラーの発生を回避する最も簡単な方法の 1 つは、RelayServerData を割り当てから直接構築する方法です。ただし、Netcode for GameObjects (NGO) バージョン 1.1.0 以降を使用する必要があります。

割り当てを作成して参加コードをリクエストする

以下のコードスニペットには AllocateRelayServerAndGetJoinCode という関数があり、Relay SDK を使用して割り当てを作成する方法、参加コードをリクエストする方法、接続の種類を DTLS に設定する方法を示しています。

public static async Task<RelayServerData> AllocateRelayServerAndGetJoinCode(int maxConnections, string region = null)
{
    Allocation allocation;
    string createJoinCode;
    try
    {
        allocation = await RelayService.Instance.CreateAllocationAsync(maxConnections, region);
    }
    catch (Exception e)
    {
        Debug.LogError($"Relay create allocation request failed {e.Message}");
        throw;
    }

    Debug.Log($"server: {allocation.ConnectionData[0]} {allocation.ConnectionData[1]}");
    Debug.Log($"server: {allocation.AllocationId}");

    try
    {
        createJoinCode = await RelayService.Instance.GetJoinCodeAsync(allocation.AllocationId);
    }
    catch
    {
        Debug.LogError("Relay create join code request failed");
        throw;
    }

    return new RelayServerData(allocation, "dtls");
}

トランスポートを設定して NGO を起動する

以下のコードスニペットには、ConfigureTransportAndStartNgoAsHost という関数が含まれています。これは、Relay SDK と NGO SDK を使用してトランスポートを設定し、NGO をホストプレイヤーとして起動する方法を示しています。

ノート: Relay サーバーをホストプレイヤーとして起動する際、接続データの両インスタンスは互いに同一です。

IEnumerator Example_ConfigureTransportAndStartNgoAsHost()
{
    var serverRelayUtilityTask = AllocateRelayServerAndGetJoinCode(m_MaxConnections);
    while (!serverRelayUtilityTask.IsCompleted)
    {
        yield return null;
    }
    if (serverRelayUtilityTask.IsFaulted)
    {
        Debug.LogError("Exception thrown when attempting to start Relay Server. Server not started. Exception: " + serverRelayUtilityTask.Exception.Message);
        yield break;
    }

    var relayServerData = serverRelayUtilityTask.Result;

    // Display the joinCode to the user.

    NetworkManager.Singleton.GetComponent<UnityTransport>().SetRelayServerData(relayServerData);
    NetworkManager.Singleton.StartHost();
    yield return null;
}

参加プレイヤー

ゲームクライアントが参加プレイヤーとして機能する場合、そのゲームクライアントは、割り当てへの参加、接続の種類の設定、Relay サーバーにバインドしてホストプレイヤーに接続リクエストを送信するための NetworkDriver のシングルトンインスタンスの作成を行える必要があります。

警告: SetRelayServerData または SetRelayClientData を通じて提供された情報と、割り当てから取得した情報が一致しない場合は、Relay サーバーに接続できません。例えば、isSecure パラメーターが一致しない場合は、"Failed to connect to server (サーバーに接続できません)" というエラーメッセージが表示されます。

このエラーの発生を回避する最も簡単な方法の 1 つは、RelayServerData を割り当てから直接構築する方法です。ただし、Netcode for GameObjects (NGO) バージョン 1.1.0 以降を使用する必要があります。

割り当てに参加する

以下のコードスニペットには JoinRelayServerFromJoinCode という関数があり、参加コードを使用して割り当てに参加し、接続の種類を DTLS に設定するための Relay SDK の使用方法を示しています。

public static async Task<RelayServerData> JoinRelayServerFromJoinCode(string joinCode)
{
    JoinAllocation allocation;
    try
    {
        allocation = await RelayService.Instance.JoinAllocationAsync(joinCode);
    }
    catch
    {
        Debug.LogError("Relay create join code request failed");
        throw;
    }

    Debug.Log($"client: {allocation.ConnectionData[0]} {allocation.ConnectionData[1]}");
    Debug.Log($"host: {allocation.HostConnectionData[0]} {allocation.HostConnectionData[1]}");
    Debug.Log($"client: {allocation.AllocationId}");

    return new RelayServerData(allocation, "dtls");
}

トランスポートを設定して NGO を参加プレイヤーとして起動する

以下のサンプルコードは、トランスポートを設定し、Netcode for GameObjects (NGO) を参加プレイヤーとして起動する方法を示しています。

ノート: Relay サーバーを参加プレイヤーとして起動する際、ホストと参加プレイヤーにはそれぞれ独自の接続データが使用されます。

IEnumerator Example_ConfigureTransportAndStartNgoAsConnectingPlayer()
{
    // Populate RelayJoinCode beforehand through the UI
    var clientRelayUtilityTask = JoinRelayServerFromJoinCode(RelayJoinCode);

    while (!clientRelayUtilityTask.IsCompleted)
    {
        yield return null;
    }

    if (clientRelayUtilityTask.IsFaulted)
    {
        Debug.LogError("Exception thrown when attempting to connect to Relay Server. Exception: " + clientRelayUtilityTask.Exception.Message);
        yield break;
    }

    var relayServerData = clientRelayUtilityTask.Result;

    NetworkManager.Singleton.GetComponent<UnityTransport>().SetRelayServerData(relayServerData);

    NetworkManager.Singleton.StartClient();
    yield return null;
}