注釈:本資料は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を使用してリレーパスを再現してください。