UIのカウンター値がシーン間で引き継がれない

こんにちは!

コイン収集数を表示するコインカウンターUI要素で問題が発生しています。問題は、新しいシーンに移動すると、表示されていた数値が消えてしまい、数値が表示されなくなることです。前のシーンに戻っても数値は復元されず、完全に消えてしまいます。

トピックを検索し、UIチュートリアルも読みましたが、解決策は見つかりませんでした。もし適切な方向を教えていただければ、大変感謝いたします。

よろしくお願いします!

何かを変更する前に、これは2つの質問に分けて検討する価値があります。画面では同じように見えますが、解決策が異なるからです。

数字が消えたのか、それとも表示が消えただけなのかを確認してください。シーン変更後、そのUI要素以外の場所(デバッグ出力や一時的なラベルなど)でコインの値を読み取り、何が表示されているかを確認します。正しい値がまだ保持されている場合、カウントは生き残っており、壊れたのは要素とのバインディングです。0と表示される場合、値自体が生き残っていません。

これは重要です。シーン内に存在するUI要素は、そのシーンと共に作成および破棄されるため、シーンから離れると要素に保持されていたものはすべて消えてしまいます。カウントが正常に動作し続けるためには、2つの条件が満たされている必要があります。カウントはシーンよりも長く存続する場所に存在している必要があり、新しいシーンが開始されると、新しく作成された要素は最後の値ではなく作成時のデフォルト値で始まるため、新しい要素はそのカウントを指し示すように設定されている必要があります。

テストの結果、値が生き残っていた場合、要素に読み取る値を指示している箇所を探し、それがゲーム開始時のみではなく、シーン開始時に実行されることを確認してください。

「いいね!」 1

UIは問題ありません。シーン間で状態が保持されています(つまり、各シーンに各UI要素のインスタンスが存在します)。しかし、UI要素内の値(数字)が消えてしまい、コインをさらに収集しても値が表示されなくなります。カウンターが収集する値は、プレイヤーからの変数から取得されています。合計収集量の変数は、デフォルトではコンソールに表示されません。AGMでは、変数値をコンソール表示に追加する簡単な方法が(私が調べた限り)見つかりません。おそらくこれは簡単なGDScriptなので、変数自体が遷移間で保持されるようにするために、自分で実装しようと思います。

ただし、それでも数字が消える理由の問題が残ります。遷移時にターゲットとなるプレイヤー変数がクリアされる場合、値が消えるのは理解できます。しかし、なぜ新しいコインが収集されたときに値が再び表示されないのでしょうか?他のUI要素は値を問題なく引き継いでいます。唯一の違いは、この要素だけが数値を表示している点です。

何も書かずに値を確認する方法として、F1デバッガーにはプロジェクトスコープとオブジェクトスコープの両方に対応するスイッチと変数リストがあり、ゲーム実行中にページをめくって確認できます: [Plugin] Baz F1 Debugger

現在、コインの数はどこに保存されていますか? プレイヤーのオブジェクト変数に設定されている場合、代わりにデータベース内のプロジェクト変数に移動することを試してみてください。プロジェクト変数はシーンに紐付かないため、シーン遷移後も値が保持され、UI要素はどのシーンからでも同じ変数を読み取ることができます。

コインをもう1つ取得したときに数値が戻ってこない件について、ディスプレイがプレイヤーオブジェクトをターゲットとして設定されており、遷移時にそのターゲットが失われている可能性があります。シーン読み込み時にオブジェクトを1回解決した後に再び見つからず、カウント処理自体は正常に動作していても、表示する値がない状態になっているのかもしれません。UI要素の設定画面のスクリーンショットを投稿していただけますか?特に、値のターゲットとして何に設定されているかを確認したいです。

「いいね!」 2

プラグインをありがとうございます、Bazさん!かなり使えそうです。コインの数をプロジェクト変数にする方法について、最適なやり方を教えていただけますか?もちろん試行錯誤はしますが、AGMやGodotでプロジェクト変数やデータベースを設定する正しい手順に詳しくないので、教えていただければ幸いです。今が学びどきですね :smiley:

プロジェクト変数:

「いいね!」 1

本当にありがとうございます!思っていたよりもずっと簡単でした。

@Baz 了解しました。ずっとこの件で試行錯誤していたのですが、見た目上はすべて正しいにもかかわらず、全く動作しません。デバッガーを使用すると、収集したコインの数をすべてカウントし、シーン遷移後も合計値を保持していることが確認できました。変数をプレイヤーからプロジェクトに切り替え、関連するすべてのスクリプトもその変更に合わせて修正しました。

UIのカウンターについては:

コインそのものについては:

唯一の変化は、UIのカウンターが値を全く表示しなくなったことです。

また、なぜかゲームを実行すると、あなたのステートトラッカーでエラーが発生しています。

引き続き、どんなお手伝いでも大変助かります。

エラーメッセージを見る限り、シグナルに接続されていないようです。これは手動で接続する必要があります。

「いいね!」 1

ここでは様々なことが起きている可能性があります。pgmmv-support@gotchagotcha.jp にプロジェクトを送っていただけないでしょうか。そうすれば、さらに詳しく調査できます。

「いいね!」 1

プロジェクトを送信しました。ご覧いただけて、本当にありがとうございます。

プロジェクトを送信していただきありがとうございます。カウンターが動作することを確認しました。

コイン、コインプロジェクト変数、そしてCoin_counterオブジェクトのDisplay Textはすべて正しく設定されています。問題は、Lvl_01_01_Ruined_City1とLvl_01_01_Ruined_City2に配置されていたCoin_counterにありました。これら2つのシーンには、切り替え前に設定されていたDisplay Textの設定のコピーが保存されており、そのコピーはプレイヤーの古いGold Coins変数を参照し続けていました。その変数はもう存在しないため、表示するものがありませんでした。Lvl_01_Ghostwood_Northには保存されたコピーがなく、何も触れていないのにカウンターは正常に動作していました。

ご自身で修正するには、両方のRuined Cityシーンを開き、UIレイヤーからCoin_counterを削除し、coin_counter.tscnから新しいものをドラッグして配置してください。両方のシーンで位置は(187, 30)です。他のシーンでも空のカウンターが表示されている場合は、同様の対処を行ってください。

今後これを回避するためには、配置されたオブジェクトがアクションの設定を変更できるオプションを、本当に異なる設定が必要な場合以外はオフにしておくことをお勧めします。このオプションがオンの場合、配置されたオブジェクトはそれぞれ独自のコピーを保持し、後でオブジェクトに対して行った変更がそのコピーに反映されません。このオプションをオフにした後、エディタは古いコピーを表示しないため、すべてが正しく見えるようになったのだと思います。

State Trackerのエラーはプロジェクトではなく、私のプラグインに起因するものです。シーン開始時に、リスニングしているシグナルを持たないGameObjectについて1回警告が出ていますが、これは何の影響もありません。プラグインの修正版を後ほど提供いたします。

「いいね!」 1

本当にありがとうございます。この件について時間を割いていただき、心から感謝しています。これを稼働させることを楽しみにしています。