RemovePlayerでPlayerControllerが削除されない

[以前の質問][1]にてRemovePlayerの存在を教えていただいたのですが、これを用いてPlayerを削除しようとしても削除されないことがあり、そのせいで入力受付の不具合が起きてしまっています。



具体的には以下のような流れで不具合が確定で発生します。

  1. セレクト画面で前レベルで作成し残っているPlayerController0~3を削除し、1~4Pのプレイヤー(PlayerControllerは0~3)を作成
  2. Load画面へ「OpenLevel」で遷移。Stageをサブレベルに置き「LoadStreamLevel」で非同期読み込みして表示
  3. Stageで実装しておいたポーズ画面を開き、セレクト画面へ「OpenLevel」で遷移(遷移前にPlayerController0~3削除)
  4. セレクト画面のレベルBPのBeginPlayで残っている全PlayerControllerを削除
  5. 削除したはずのPlayerControllerが残っており、入力受け付けを吸われてしまう不具合を起こす

※2において、非同期ロードしなくても同様のバグが発生します。

※3において、遷移前に全PlayerControllerを削除しようとした場合、PlayerController1, 3が削除されず、セレクト画面でPlayerController0のみが初めから存在します(PlayerStartはセレクト画面に置いていません)。



以下は検証BPと結果です。



削除直後に残存確認BPを置く。



特にエラーを吐くこともなくRemovePlayerが実行されているが、PlayerController0,1だけが何故か残っている。削除に時間がかかっているのかと思いDelayを置くが同様の結果。

221131-無題.png



Possesを設定すれば確かに済む話ではあるのですが、根本的解決にならないのと、本当に全PlayerControllerを完全削除したい場合が万が一に発生した場合の解決策としたいというのがあります。
これが何故発生してしまうのか、また解決策をご存じの方がいたらアドバイスの方よろしくお願いいたします。

私の方でも同様の検証を行ってみました。以下のようにノードを組んでいます。

一度作ったPlyaerControllerを配列に格納し、それをループで全てRemove Playerにて削除します。

その後にもう一度ループを行い、全てのPlayerControllerを検証してみましたが、いずれも無効化されており使用できませんでした。少なくともシンプルに作成されたものであれば問題は発生しません。

おそらくレベル遷移を行った時に何かしらの問題が起きています。ソースコードレベルでRemovePlayer内部を見ると、PlayerControllerのNetRoleが"ROLE_Authority"が以外だった場合はPlayerControllerが削除されない可能性があります。

別レベルで作成されたPlayerControllerはNetRoleが違うものが設定されている可能性もあります。特にOpenLevelでパーシスタントレベルを変更した際にはご注意ください。問題がどうしようもならない場合にはOpenLevelを行わずにサブレベルの遷移のみで作ることをおすすめします。

ソースコードレベルでRemovePlayer内部を見ると、PlayerControllerのNetRoleが"ROLE_Authority"が以外だった場合はPlayerControllerが削除されない可能性があります。
別レベルで作成されたPlayerControllerはNetRoleが違うものが設定されている可能性もあります

なるほどその情報は知りませんでした。情報ありがとうございます!

言われてみればまず内部の実装を見て検証してみるべきでした…

OpenLevelを行わずにサブレベルの遷移のみで作ることをおすすめします。

そうしてみます。ありがとうございます!