特定条件下においてEjectを行うとAddToPlayerScreenで追加したWidgetが非表示のままになる

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

特定条件下においてEject(F8キー)​を行うと

AddToPlayerScreenで追加したWidgetが非表示のままとなり復帰しないようです。

こちらの挙動は仕様となりますでしょうか?

何か改善策が無いかのご相談となります。

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

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

本件添付いただいたサンプルプロジェクトを元に動作を確認させて頂いておりますが、

Ejectキー(F8)を実行した場合でも非表示となるような挙動を確認できていない状態となります。

今回、特定条件下で発生する旨伺っておりますが、必要な再現手順等がありましたらご連絡頂けますと幸いです。

よろしくお願いいたします。

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

サンプルプロジェクト提出時の再現手順欄に記載したのですが

上手く投稿出来ておりませんでしたでしょうか。

念のため再度記載させていただきます。

(サンプルプロジェクトでの再現手順となります)

[再現手順]

  1. /Content/FirstPerson/Lvl_FirstPerson.umap を開く
  2. [マルチプレイヤーオプション]-[プレイヤー数]を 2以上にする
  3. [選択ビューポート]にてPIE
  4. F8キーでEjectを行うとAddToPlayerScreenで追加したWidgetのみ非表示となる
  5. 再度F8キーを押してもWidgetは非表示の状態

[備考]

  • [マルチプレイヤーオプション]-[プレイヤー数]が1の場合は再現しない
  • AddToViewportで追加したWidgetは再現しない

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

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

手順に関して記載頂きありがとうございます。頂いた手順にて問題を確認できました。

添付時にも記載頂いていたとのことで、お手数おかけしてしまい申し訳ございません。

調査を行わせていただいたところ、今回の問題の原因としましては以下のような挙動となっておりました。

AddToPlayerScreenの実行時には、Player毎に作成されるWidgetのLayerに該当のWidgetが追加されますが、

PIE時のEjectを行うとLocal Playerの切り替えが行われ、またマルチプレイヤー時には内部で管理されているGamePlayersが変更されることから、

レイヤーを管理しているManagerがUpdateLayoutにて利用されていないPlayerのレイヤーを削除してしまい、

再度PIEにプレイヤーが復帰した際にはLayerが再作成されてしまう、といった挙動となっておりました。

※結果としてマルチプレイヤーPIE時にEditorに切り替えを行ったプレイヤーのみAddToPlayerScreenで追加したものが初期化されてしまう

ToggleBetweenPIEandSIE等切り替えのタイミングで再度追加するような復帰対応も考えられますが、

現時点ですぐに対応可能な方法としましては、新規エディタウィンドウ(PIE)モードで起動して頂く方法が挙げられます。

[Image Removed]

お手数おかけしますが、こちらで対応可能かご確認いただけますと幸いです。

よろしくお願いいたします。

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

調査及びご提案ありがとうございます、内容についても承知いたしました。

現在マルチプレイ型のコンテンツ開発を行っているため

PlayAsClientでプレイヤー数を2以上にした作業イテレートが多く

Ejectも問題なく機能するようにしたいと考えております。

エンジン部分の拡張も視野に入れた場合

ワークアラウンド的なものを適用することは現実的でしょうか。

> ToggleBetweenPIEandSIE等切り替えのタイミングで再度追加するような復帰対応

システム的に困難な場合、こちらコストや副作用が重くなければ検討したいのですが

具体的な内容をご教示いただけないでしょうか。

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

ご確認いただきありがとうございます。

こちら改めて確認させていただいたところ、エンジン改変が可能な場合はEject時(Simulateモードに切り替え)にRemoveMissingPlayerLayers()を呼び出さないようにすることで回避可能なことを確認しております。

参考コード

.\Engine\Source\Runtime\Engine\Private\Slate\SGameLayerManager.cpp

void SGameLayerManager::UpdateLayout()
{
...
#if WITH_EDITOR
		if (!GEngine->GameViewport->GetGameViewport()->GetPlayInEditorIsSimulate())
		{
			RemoveMissingPlayerLayers(GamePlayers);
		}
#else
		RemoveMissingPlayerLayers(GamePlayers);
#endif

復帰処理の実装よりも上記方法の方がコストはかからない見込みとなっており、実際のWidget等でお試しいただければと思います。

お手数おかけしますが、よろしくお願いいたします。

提示いただいた内容をエンジン側に適用したところ

こちらでも現象の改善を確認することが出来ました。

本件は解決とさせていただきたいと思います。

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

ご対応及び結果を共有頂きありがとうございます。無事改善が確認できたとのことで何よりです。

本件はクローズとさせていただきますが、また何かございましたらお気軽にご相談ください。

よろしくお願いいたします。​