【Godot】コリジョンの形状を実行時にデバッグ表示する方法

エディタ上では可視化されているコリジョンの形状を、実行時にも表示する方法を調べてみました。

エディタで制御する

「エディタのメニュー > デバッグ」 から 「コリジョンの形状の表示」にチェックを入れると実行時にもコリジョンの形状が表示されるようになります。

スクリプトで制御する

スクリプトでの制御で、コリジョンの形状をデバッグ表示するには「get_tree().debug_collisions_hint = true」と記述します。

extends Node2D

func _ready() -> void:
	# コリジョンを可視化する
	get_tree().debug_collisions_hint = true

func _process(delta: float) -> void:
	if Input.is_action_just_pressed("ui_accept"):
		# このタイミングで切り替えられない
		var tree = get_tree()
		var flag = tree.debug_collisions_hint
		tree.set_debug_collisions_hint(!flag) # フラグを反転

ただし、この変更はいつでもできるわけではなく、_ready() のタイミングのみ切り替え可能とのことです。(_process()などのタイミングで切り替えることはできません)

The most promising thing I’ve found so far is the debug_collisions_hint property of SceneTree. However, it seems to be a bit finicky: If I set the field to true inside of _ready(), then collision shapes will be visible. But if I try to change its value later (in _unhandled_key_input() specifically), nothing happens.

私がこれまでに見つけた最も有望なものは、SceneTreeのdebug_collisions_hintプロパティです。 ただし、少し厄介なようです。_ready()内でフィールドをtrueに設定すると、衝突の形状が表示されます。 しかし、後で(具体的には_unhandled_key_input()で)その値を変更しようとしても、何も起こりません。

I just need this for debugging purposes, but it’d be nice not to have to close the game, manually toggle the option, and restart the game every time.

デバッグの目的でこれが必要なだけですが、ゲームを閉じたり、オプションを手動で切り替えたり、毎回ゲームを再起動したりする必要がないのはいいことです。

How can I toggle visible collision shapes/polygons from a script?

参考