シームレストラベル中にクライアント切断が生じた場合のAGameMode::NumTravellingPlayers

お世話になっております。

<br/>

シームレストラベル中に切断したクライアントは

AGameMode::NumTravellingPlayers に反映されず

同期を行うべき実際の人数と差異が生じているようです。

<br/>

同様の問題について下記投稿を見つけたのですが

[AGameMode::NumPlayers decrementing instead of NumTravellingPlayers if client leaves during [Content removed]

<br/>

現行最新のUE5.7.4、Mainストリームでも未修正に見受けられました。

未修正の場合、修正時期はいつぐらいを予定されておりますでしょうか。

<br/>

また、投稿内で言及されているワークアラウンドも部分的であるため

現状はどういったワークアラウンドが適切かご教示いただけますと幸いです。

<br/>

以上、よろしくお願いいたします。

[Attachment Removed]

UE-220697ですがGameModeBaseではなく派生のGameModeの実装ということもあり通常の緊急性というラベルになっています。

過去に一度修正が試みられたのですがレビューで却下という結果になり、まだ未修正のステータスのままです。今後の修正時期に関しては未定となっております。

改めて私の方で動作を確認した所、本来であればOnNetCleanupの関数内で保存されているGNetConnectionBeingCleanedUpが、

HasClientLoadedCurrentWorldの冒頭の条件で参照されて正しい処理がなされることが想定されているのですが(NetConnection.hのGNetConnectionBeingCleanedUpの定義のコメントも併せてご参照ください)、

GNetConnectionBeingCleanedUpがセットされた直後に Player->PlayerController が nullptr がクリアされてしまっているので、常に条件を満たさなくなっています。

以下のようにクリア部分をON_SCOPE_EXITで囲う修正でこのトリックを機能させることが出来るようです。お試しいただけますでしょうか。

void APlayerController::OnNetCleanup(UNetConnection* Connection)
{
	UE_LOG( LogPlayerController, Warning, TEXT("OnNetCleanup %p"), this );
	UWorld* World = GetWorld();
	// destroy the PC that was waiting for a swap, if it exists
	if (World != NULL)
	{
		World->DestroySwappedPC(Connection);
	}
 
	check(UNetConnection::GNetConnectionBeingCleanedUp == NULL);
	UNetConnection::GNetConnectionBeingCleanedUp = Connection;
	//[Content removed] we'll need to insert
	// a call to ClearOnlineDelegates() here so that PlayerController.ClearOnlineDelegates can use the correct ControllerId (which lives
	// in ULocalPlayer)
	ON_SCOPE_EXIT{
		// The PlayerController should be cleared on exit.
		// It must remain valid for HasClientLoadedCurrentWorld(), which is called during Destroy().
		if (Player && Player->PlayerController == this)
		{
			Player->PlayerController = nullptr;
		}
	};
	Player = NULL;
	NetConnection = NULL;	
	Destroy( true );
	UNetConnection::GNetConnectionBeingCleanedUp = NULL;
}

[Attachment Removed]

ご確認ありがとうございます。貴プロジェクトでも改善が得られたことを弊社のバグチケットにコメントとして追記させていただきました。

それでは本件をクローズさせていただきます。

[Attachment Removed]

> 今後の修正時期に関しては未定となっております。

承知いたしました。

> 以下のようにクリア部分をON_SCOPE_EXITで囲う修正でこのトリックを機能させることが出来るようです。お試しいただけますでしょうか。

ご提示いただいたワークアラウンドを適用し問題が改善されることを確認しましたので

一旦こちらで運用を行っていきたいと思います。

ご対応ありがとうございました。

[Attachment Removed]