【UE5】オンラインマップでは動かない公式サンプル

この記事は約5分で読めます。
Just a moment...

オフラインマップならちゃんと動くんだが、オンラインマップでは動かない。こういうのが結構ある。

Restart Player at PlayerStart did not work on multiplayer
In some case I want to restart a player at a specific player start. So I use the node “Restart Player at PlayerStart”. B...

このフォーラムの人によると、シングルプレーヤーやリッスンサーバーなら問題ないらしい。クライアント/専用サーバーだとダメ。俺も同じ現象が出てる。

Ok, i found out by myself. First I have to unpossess the player, otherwise it will not work.
Now it is working in multiplayer if I play as client.

Un Possessをやってみたら確かにできた。その前にDestroy Actorをやる必要はない。やる場合はDestroyイベントの処理が終わるまで待つ必要があったりするのかもしれない。Destroy Actor→Un Possessと立て続けに実行させるとちゃんと動かなかった。

これで漸く参戦処理問題が解決できた。
クライアントでチームを決めてマップに入る場合、サーバーのChoose Player StartもOnPostLoginも間に合わない。一旦、何処かにスポーンさせてから、クライアントのチームIDがRPCでサーバーに送られてきたタイミングでスタート位置を再設定すればいい。で問題ないと思うんだが。クライアントが増えたらどうなるか。

追記)
他の問題がでてきたかも。サーバーだけで所有権を放棄すると、クライアントのSelfが変わってちゃんと動かなくなるのか?なんとなくそんな感じっぽい。クライアントも何かしてあげなきゃダメなのかも。なかなか一筋縄じゃいかないなぁ。

追記の追記)
所有権を放棄するだけじゃダメだった。同じキャラが2人になる。一人はコントロールできないが、クライアントのSelfはこのキャラを示してるみたいだ。やっぱりちゃんと消し去ってからRestartしなきゃダメみたいだ。

追記の追記の追記)
Characterクラスのサーバー側で(つまりRPCで)DestroyActorをするとリスポーンされた。しかし、正しく動かない。ログによればクラスごとリセットされてる。これは特にシングルプレーヤーなら問題ないはずだが、マルチプレーヤーだとPlayerStateやGameStateなんかもリセットされなきゃ辻褄が合わなくなるからちゃんと動かないのかもしれない。
そして上のフォーラムの中に次の意見があった。

If you want the exact spot ( Player Start ), then you need to create an array of spawn points. Then store which array index was used on the owning controller.

You’ll need to create your own Game Mode spawning system. Then simply pass the Index to the spawning system.

独自のゲームモードスポーンシステムを作る必要があるってやつ。これはまた嵌ったかもしれない。ただ、上のフォーラムにあったように死んだ位置からSet Actor Locationで瞬間移動させるようなやり方でもいいのかな?とも思う。

しかし、あとでDestroyActorが必要になった場合に困るかもしれない。

ちゃんとログを見てみると、Character_C_0をDestroyActorしてリスタートさせると、Character_C_1などのようになる。オブジェクト名が変わるんだ。だからオブジェクト名を見て処理してる部分がちゃんと動かなくなる。そこをどうにかすれば動くようになるはず。

追記の追記の追記の追記)↑こういう問題じゃなかった。
オブジェクト名が変わるのは問題ない。どうやらWidgetのオブジェクト参照をCharacterクラスで使ってたのが問題だった。DestroyActorでCharacterクラスがリセットされても、Widgetを取り直さなかったせいだったみたいだ。取り直すようにすると、それなりに動くようになったんだが、何故かLineTraceForObjectsの挙動が変わった。自分の除外ができなくなった。

【UE5】LineTraceForObjectsのIgnore Self
最初は意味が分からなかったが、いろいろやってみて分かったかもしれない。これの場合、Hitした物がSelfって解釈すればいいみたいだ。Ignore Selfにチェックを付けると、Hitした物を無視するってことになって、Hitした物を透過するよ...

以前ちゃんと確認して、ずっとちゃんと動いてたんだけど。どうしてなのか。今はここで嵌ってる。←分かった。以前まではSelfで自分を除外できてたんだが、何故かGetPlayerCharacter(0)で指定してやらないと除外できなくなった。Destroy Actorをやってできなくなったんならまだ分かるが、そうじゃなかった。Destroy Actorが実行されなくても、そのノードがあるだけで他のノードのコードが変わってるんだろうか。それなら意味が分かる。それと、GetOwnerでもダメだった。こっちもDestroyActorやる前なんだが。Destroy Actorノードが含まれることによって所有権とかがシビアになったとかなのか?よく分からんが、Get~~~系でplayer index(0)を付ける奴は信用できるみたいだ。今のところちゃんと動いてる。良かった。疲れた。

コメント

タイトルとURLをコピーしました