Skip to content

Instantly share code, notes, and snippets.

@KnIfER
Last active September 8, 2025 07:36
Show Gist options
  • Save KnIfER/c7bc7638a6db0aabc0883ca47b83f4da to your computer and use it in GitHub Desktop.
Save KnIfER/c7bc7638a6db0aabc0883ca47b83f4da to your computer and use it in GitHub Desktop.
godot editor tool script auto update on tweaking parameter
tool
extends Spatial
#@export var test_health: int = 100
#@export var test_score: int = 0
export var auto_update: bool = true
export var eval_interval:float = 0
var eval_time = 0
var exported_values: Dictionary = {}
func on_property_changed(prop_name: String, old_value, new_value):
print("Property '", prop_name, "' changed from ", old_value, " to ", new_value)
func on_property_update():
print('on_property_update')
pass
func is_export(usage):
return (usage&PROPERTY_USAGE_EDITOR) and (usage&PROPERTY_USAGE_SCRIPT_VARIABLE )
func _process(delta: float):
if Engine.is_editor_hint() and auto_update and get("visible") and eval_check(delta):
eval_dump()
# Dump exported values
func eval_dump():
exported_values.clear()
for prop in get_property_list():
if not is_export (prop.usage ) :
continue
var key = prop.name
exported_values[key] = get(key)
# Check exported values
func eval_check(delta: float):
eval_time += delta
if eval_time < eval_interval:
return
eval_time = 0
if not exported_values.size():
eval_dump()
var updated = 0;
var props = get_property_list()
#print('props_sz=', props.size())
for prop in props:
if not is_export(prop.usage) :
continue
#print(prop)
var key = prop.name
var now = get(key)
var prev = exported_values.get(key, null)
if now != prev:
updated = 1
# on_property_changed(key, prev, now)
if updated:
on_property_update()
return updated
@tool
extends Node3D
#@export var test_health: int = 100
#@export var test_score: int = 0
@export var auto_update: bool = true
@export var eval_interval:float = 0
var eval_time = 0
var exported_values: Dictionary = {}
func on_property_changed(prop_name: String, old_value, new_value):
print("Property '", prop_name, "' changed from ", old_value, " to ", new_value)
func on_property_update():
print('on_property_update')
pass
func is_export(usage):
return (usage&PROPERTY_USAGE_EDITOR) and (usage&PROPERTY_USAGE_SCRIPT_VARIABLE )
func _process(delta: float):
if Engine.is_editor_hint() and auto_update and get("visible") and eval_check(delta):
eval_dump()
# Dump exported values
func eval_dump():
exported_values.clear()
for prop in get_property_list():
if not is_export (prop.usage ) :
continue
var key = prop.name
exported_values[key] = get(key)
# Check exported values
func eval_check(delta: float):
eval_time += delta
if eval_time < eval_interval:
return
eval_time = 0
if not exported_values.size():
eval_dump()
var updated = 0;
var props = get_property_list()
#print('props_sz=', props.size())
for prop in props:
if not is_export(prop.usage) :
continue
#print(prop)
var key = prop.name
var now = get(key)
var prev = exported_values.get(key, null)
if now != prev:
updated = 1
# on_property_changed(key, prev, now)
if updated:
on_property_update()
return updated
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment