2026-10-08

Godotでダイアログを毎回作成する代わりに表示切替にしたら、スクロールバーの位置が戻らない

最近作ったローグライトは、表示専用のダイアログがいくつかあります。デッキをクリックしたらデッキのカード一覧を表示するダイアログが表示され、トラッシュも同様です。もしカードの効果でトラッシュから1枚選ぶことになったら、トラッシュを参照する選択ダイアログが表示されます。

デッキの内容を表示するダイアログ

このようなシンプルなダイアログは、インスタンスを毎回作成するよりも、必要な時に表示だけ切り替えた方が無駄が少ないように思えました。

そこで、Godotのエディターに表示されているノードツリーの最後にダイアログを追加して、初期状態は非表示にしました。一見すると上手く動いているように見えましたが、スクロールの位置が一番上に戻っていないことに気づきました。

スクロールバーを一番上や一番下に移動する方法は、検索すれば過去のフォーラムのやりとりなどから見つかります。

How to get scrollbar to automatically scroll to bottom? - Help - Godot Forum
https://forum.godotengine.org/t/how-to-get-scrollbar-to-automatically-scroll-to-bottom/74013

要点だけ抜き出すと、以下のようなスクリプトでScrollContainerのスクロールバーの位置を一番上に戻します。(deferredが付くメソッドやawaitを使ってタイミングの調整が必要かもしれません)

scroll_container.scroll_vertical = int(scroll_container.get_v_scroll_bar().min_value)

今回は、どのダイアログもスクロールバーが1個だけなので、上記の処理を組み込むことで解決しました。

仮にスクロールバーが沢山あるダイアログがあった場合、上記の処理をstaticメソッドとして共通化したり、ScrollContainerを継承するクラスに実装して自動的に呼ばれるようにするなどの対処法が考えられます。しかし、そこまでの手間を掛けるよりも、自分の中で基準を決めて、複雑なダイアログは無理にノードツリーに保持しない方がよさそうです。

0 件のコメント:

コメントを投稿