メインコンテンツまでスキップ
Last updated on August 3, 2026

注釈:本資料はAI技術を用いて翻訳されています。

OSS を使用して P2P トランスポートを設定する

このガイドでは、マッチングされたゲームセッション向けに、Unreal Engine の P2P 固有のトランスポート設定とホスト接続動作について説明します。

マッチチケットの作成、マッチ結果の処理、ゲームセッションへの参加を含む共通の Matchmaking フローについては、マッチメイキングを統合する (Unreal)を参照してください。そのガイドのホスト接続手順に到達したら、P2P タブを選択し、トランスポートの前提条件としてこのページを使用してください。

プラグインの依存関係

OSS を使用した P2P には、P2P 機能向けの Network Utilities プラグインを含む AccelByte OSS プラグインスイート一式が必要です。詳細な依存関係情報については、UE プラグイン依存関係ガイドを参照してください。

前提条件

  • P2P セッションタイプのセッションテンプレートを使用するようにマッチプールを設定します。P2P を設定するを参照してください。

  • DefaultEngine.ini ファイルに以下を追加して、AccelByte Online Subsystem (OSS) で Sessions V2 を有効にします。

    [OnlineSubsystemAccelByte]
    bEnableV2Sessions=true
  • DefaultEngine.ini に以下を追加して AccelByteNetworkUtilities を有効にします。

    [AccelByteNetworkUtilities]
    UseTurnManager=true
    HostCheckTimeout=5

    [/Script/AccelByteNetworkUtilities.IpNetDriverAccelByte]
    NetConnectionClassName=AccelByteNetworkUtilities.IpConnectionAccelByte
    AllowDownloads=false

    [/Script/Engine.Engine]
    !NetDriverDefinitions=ClearArray
    +NetDriverDefinitions=(DefName="GameNetDriver",DriverClassName="/Script/AccelByteNetworkUtilities.IpNetDriverAccelByte",DriverClassNameFallback="/Script/OnlineSubsystemUtils.IpNetDriver")
    +NetDriverDefinitions=(DefName="DemoNetDriver",DriverClassName="/Script/Engine.DemoNetDriver",DriverClassNameFallback="/Script/Engine.DemoNetDriver")
注記

非シームレストラベル失敗の回避策

非シームレストラベル中、Unreal Engine のベースネットワーキングクラス(UIpConnection)は AccelByte IP 形式で DNS 解決を試みますが、この形式は有効な DNS ホスト名ではありません。その結果、解決に失敗し、ネットワークエラーが発生します。

この問題を回避するには、DefaultEngine.ini ファイルの [AccelByteNetworkUtilities] セクションに bNonSeamlessTravelUseNewConnection=true を設定してください。このオプションを有効にすると、ベース接続の初期化前に DisableAddressResolution() が呼び出され、Unreal Engine が AccelByte アドレスで DNS 解決を試みないようにします。

[AccelByteNetworkUtilities]
bNonSeamlessTravelUseNewConnection=true

P2P ゲームセッション参加後に接続する

共通の Matchmaking フローでゲームセッションに参加した後、ローカルプレイヤーが P2P ホストかどうかを確認します。ホストは listen server として travel します。他のメンバーは、解決された P2P 接続文字列に travel します。

const FOnlineSessionAccelBytePtr SessionInterface = GetSessionInterface();
check(SessionInterface.IsValid());

FNamedOnlineSession* Session = SessionInterface->GetNamedSession(SessionName);
check(Session != nullptr);

TSharedPtr<FOnlineSessionInfoAccelByteV2> SessionInfo =
StaticCastSharedPtr<FOnlineSessionInfoAccelByteV2>(Session->SessionInfo);
check(SessionInfo.IsValid());

if (SessionInfo->GetServerType() != EAccelByteV2SessionConfigurationServerType::P2P)
{
return;
}

const FUniqueNetIdPtr LocalPlayerId = GetUniquePlayerId();
if (!ensure(LocalPlayerId.IsValid()))
{
return;
}

ULocalPlayer* LocalPlayer = GetLocalPlayer();
if (!ensure(LocalPlayer != nullptr))
{
return;
}

APlayerController* Controller = LocalPlayer->GetPlayerController(GetWorld());
if (!ensure(Controller != nullptr))
{
return;
}

FString TravelUrl{};
if (SessionInterface->GetResolvedConnectString(SessionName, TravelUrl, NAME_GamePort) && !TravelUrl.IsEmpty())
{
if (SessionInterface->IsPlayerP2PHost(LocalPlayerId, SessionName))
{
FString MapName;
Session->SessionSettings.Get(SETTING_MAPNAME, MapName);
Controller->ClientTravel(FString::Printf(TEXT("%s?listen"), *MapName), TRAVEL_Absolute);
}
else
{
Controller->ClientTravel(TravelUrl, TRAVEL_Absolute);
}
}
ヒント

デバッグ目的で Interactive Connectivity Establishment (ICE) 接続に Relay (TURN) を使用するには、ゲーム起動時に追加パラメータ -iceforcerelay を渡します。

トラブルシューティング

  • P2P 接続が確立されたかどうかを確認するには、AccelByte Network Utilities の ICE/WebRTC data channel の結果を確認します。RegisterICERequestConnectFinishedDelegate(...) を登録し、EAccelByteP2PConnectionStatus::Success を、ピア接続が確立されたことを示すネットワークレベルのシグナルとして扱います。Lobby websocket の接続や JoinSession() の成功は、サービスまたはセッションへの接続を確認するだけで、P2P data channel が接続されたことは証明しません。Private Cloud の可観測性では、bSendMetricAutomatically=true を維持すると、ICE 接続成功後に Network Utilities が TURN connection metric を送信します。
  • JoinSession() は成功するが travel に失敗する場合は、AccelByteNetworkUtilities の net driver 設定を確認し、非シームレストラベルを使用している場合は bNonSeamlessTravelUseNewConnection=true を追加してください。
  • クライアントが直接接続では成功するがリレーが必要な場合に失敗する場合は、TURN Manager が有効であること、namespace で TURN リージョンが利用可能であることを確認し、-iceforcerelay を使用してリレーパスを再現してください。