執筆バージョン: Unreal Engine 5.3
|
こんにちは!マルチプレイヤーゲームを作っていて、こんなことを思ったことはないでしょうか?
「マルチプレイ中、切断したプレイヤーがいても Pawn は残したいな~」
ゲームのルールや状況などにもよりますが、なんらかの理由でサーバーから切断したプレイヤーの Pawn を
サーバーや他のプレイヤー環境では残したいシチュエーションがあります。
デフォルトでは、あるクライアントが切断すると、サーバー上の切断したクライアントの Pawn も Destroy されるため、
他のクライアント環境でも Pawn がいなくなります。
次のサンプルでは、右画面のクライアントが切断しています。
![](https://historia.co.jp/wp/wp-content/uploads/2024/03/LeaveWithoutUnpossess.gif)
すると、切断していない左側のプレイヤー画面も1人になってしまいました。寂しい。
これは、APlayerController の PawnLeavingGame() が実行される前に
UnPossess() することで対応することが可能です。
例えば、APlayerController を継承した以下のようなコードを書いてみましょう:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
// MyPlayerController.hpp UCLASS() class MYSAMPLE_API AMyPlayerController : public APlayerController { GENERATED_BODY() public: /** クライアントがゲームを離れるときも Pawn を Destroy() せず UnPossess() してほしい場合は true にする */ UPROPERTY(BlueprintReadWrite, EditAnywhere) bool bUnPossessPawnIfClientLeavingGame; public: /** Pawn (を所持するプレイヤー)がゲームを離れるときに実行される処理 */ virtual void PawnLeavingGame() override; }; |
|
// MyPlayerController.cpp void AMyPlayerController::PawnLeavingGame() { // プロパティが True に設定されていたら if (bUnPossessPawnIfClientLeavingGame) { // クライアントがゲームを離れるとき Pawn を UnPossess() する UnPossess(); } // 親クラスの処理を呼び出す。 // Pawn を UnPossess() していなければ、ここで Destory() される Super::PawnLeavingGame(); } |
上記のコードをビルドしたのち、エディタ上で AMyPlayerController を継承した
Blueprint クラス BP_MyPlayerController を作成し、
UnPossessPawnIfClientLeavingGame プロパティを True にします。
それでは、PlayerController を BP_MyPlayerController に差し替えたレベルで、挙動を試してみましょう:
![](https://historia.co.jp/wp/wp-content/uploads/2024/03/LeaveWithUnpossess.gif)
右画面のプレイヤーが切断しても、切断していない左画面では Pawn を残すことができましたね!
これでもう寂しくない!
マルチプレイヤーゲームでは、さまざまなシチュエーションで
プレイヤーの意図する切断、意図しない切断の両方が発生するため、その際のケアが必要となります。
もし Pawn を残す実装を作りたい場合に、この記事が参考になると幸いです。