【Godot4.2.x】ノードの複製とブランチをシーンとして保存のバグ

次元ドアの開発時に悩まされた、インスペクターで設定したはずのノードがズレる問題の説明です。

作成日: 2024-02-22

Godot記事一覧

目次

次元ドア開発時に起きた問題

次元ドアのステージ作成中、仲間や敵を配置している時に問題が置きました。仲間や敵は、移動先に足場がないと向きを変えます。その処理のために足場を確認するためのArea2Dを左右の足元に置いています。

仲間の足元

それらはルートのFriendAのスクリプトにアタッチしています。

ノードを設定

このようなシーンをステージに配置したあと、仲間を増やすために複製をした時に問題が発生しました。

FriendAを複製してFriendA2を作る

複製されたFriendA2の足元ノードのパスをインスペクターで確認してみると、以下の通りもとのFriendAの足元を参照してしまっています。

ノードパスが違う

これでは、FriendA2はFriendAの状態に応じて動くことになるので、変なところで向きを変えてしまうことになります。

因みにもとのFriendAは以下の通り想定通りのパスになっています。

FriendAのパス

ステージを作成している際に仲間が変な動きをしていたのはこれが原因だったようです。他の仲間の足元を参照していたので、想定外の場所で反転をしていたのです。

もう一つのバグ

同じバグが原因らしい症状がもう一つあります。ブランチをシーンとして保存する際に、ノードパスが消えてしまう問題です。

以下のような簡単なシーンを作成しました。

最初の状態

MyNodeのスクリプトに、他のノードを受け取る変数をエクスポートして、インスペクターで子供のノードMyChildをアタッチしました。

MyNodeをブランチをシーンとして保存するでシーンに変換します。

シーンとして保存

これでシーンになったのですが、選択してインスペクターを確認すると先ほど割り当てたMyChildが消えてしまっています。

設定が消えてしまっている

作成したシーン側でも消えてしまうので、再設定が必要になります。これも恐らく問題になっていたと思われる症状です。

問題は4.3dev1で解消済み

調べたところ、この件は去年の6月には報告が上がっていました。

https://github.com/godotengine/godot/issues/78060

解決に苦戦したようで4.2には間に合いませんでしたが4.3で解消するようです。4.3 dev3で確認したところ、無事に解決していました!

4.2を使う間は、以下に気を付けて使いたいと思います。

  • 複製したときは、ノードの設定を確認する
  • ブランチをシーンとして保存は使わず、最初から新規シーンで構成してから他のシーンに配置するのが安全

参考URL

  • https://github.com/godotengine/godot/issues/78060
  • https://github.com/godotengine/godot/pull/83343
  • https://godotengine.org/download/archive/4.3-dev3/

Godot記事一覧