読み込み後のシーンツリー内でのオブジェクト位置変更とクラッシュについて教えてください

以前から気づいていなかった深刻な問題について、自分の体験を共有します。

【セーブデータの読み込み時にクラッシュする問題】

通常、異なるシーン(GameScene)に同じプレイヤーオブジェクトを配置して、各シーンでの操作テストを行います。
プレイヤーがシーン1からシーン2へ移動した場合、プレイ中に問題が発生することはありません。
しかし、シーン2でセーブしてからロードしようとすると、すぐにフリーズしてクラッシュします。

この原因は、2つのシーンに同じプレイヤーオブジェクトが配置されており、ロード時に2回インスタンス化されることでクラッシュが発生するためです。
解決策は簡単そうでしょうか?シーン1以外のシーンからプレイヤーオブジェクトを削除すればよいのです。

そうすれば、プレイヤーがシーン1以外のシーンに移動してセーブ・ロードしてもクラッシュしなくなります。

しかし、ここで大きな問題が発生します。プレイヤーが他のシーンからシーン1に戻ってセーブし、ロードした場合です。
同じようにクラッシュします :clown_face: :joy:

原因は上記と同じです。シーン1のノードにはプレイヤーというオブジェクトが存在するため、プレイヤーがシーン1を離れると、そのオブジェクトはもはやシーン1内にインスタンス化されたものではなくなります。そのため、シーン1に戻った際にシステムがさらにプレイヤーを生成し、クラッシュを引き起こします。

これは非常に頭が痛い問題です。制作しているのはメトロイドヴァニア風のマップで、プレイヤーは複数のシーンを自由に移動できます。もし最初のシーン1に戻ってロードするとクラッシュするという事態はひどすぎます。これを救う方法をご存知ですか?

================================================
【セーブデータ読み込み時のシーンツリー内オブジェクトの位置の問題】

あるプレイヤーオブジェクトが新しいシーンツリーに入った場合、プレイヤーのノードはシーンツリーのどの位置に配置されるのでしょうか?

テストの結果、プレイヤーが新しいシーンに移動すると、デフォルトでシーンツリーの最下部に配置されることがわかりました。これは直感的に理解できますね。nice!

同時に、新しいシーンでセーブしてロードすると、プレイヤーがシーンツリー内の位置が変化していることがわかります↓

図に示されているように、ロード後、プレイヤー(P1)は自動的にこのParallax2D親ノードの最上部に移動します。これにより、同じZソート順を持つ他のオブジェクトがプレイヤーの手前に表示されてしまいます。

この理由が理解できません。新しいParallax2Dノードを作成しても試してみましたが、プレイヤーはこのParallax2D親ノードの下にしか現れません。現在の状況で、ロード後にP1がシーンノードツリー内で位置を動かなくする方法はありますか?

両方を再現して報告しました。丁寧な説明をありがとう!

「いいね!」 1

ご報告ありがとうございます!

これは本来、エンジンのロジックに関する問題ですが、良い解決策が思い浮かびません。公式側がバックエンドのコードを最適化してくれれば、さらに良いですね!

プレイヤーがシーン1からポータルを使ってシーン2へ移動する場合、シーン2のツリーノードにプレイヤーオブジェクトノードが配置されていても、システムは自動的にクリーンアップして再配置し、「シーン内にプレイヤーが1体だけ存在する」ことを保証する処理を行います。

セーブデータの読み込み時のクラッシュは、「一般的な復元」プロセスが原因です。これはシーン(デフォルトのプレイヤーノード)の読み込みを担当し、その後セーブデータに基づいてオブジェクト(別のプレイヤー)を作成します。この2つが重複して衝突し、クラッシュが発生します。

セーブデータの読み込みには、ポータル移動時のような「シーン内にプレイヤーが1体だけ存在する」ことを保証する処理ステップがありません。もしバックエンドの処理ロジックがポータル移動と同じであれば、クラッシュや強制終了を防げるだけでなく、ユーザーにとっても扱いやすくなるでしょう :thinking:

似たような状況として、ゲームに各シーンへ瞬移する機能を設計する場合、通常はシーン内にオブジェクト生成設定を配置し、瞬移ボタンをクリックすると指定された場所にオブジェクトを生成します。

もしシーン内のツリーノード自体にプレイヤーオブジェクトが配置されている場合、瞬移でプレイヤーオブジェクトを生成すると、同じような問題が発生します…