Export variables not behaving as expected

Godot Version

Godot 4.7 dev4

Question

So there is an issue with the export variables.

When object is instantiated, the export variables and setters appear to work in the Editor, but the values in the Inspector don’t change and they go back to default values when running the game.

s64_target_bug_0

When changing the %PointToTarget to a $PointToTarget, it breaks further.

@tool
class_name ComponentTargetable
extends Node3D


@export var enabled: bool = true
@export_range(0, 100, 0.001) var to_target_distance: float = 5.0:
	set(value):
		value = abs(value)
		%PointToTarget.radius = value
		%PointEndTargetSubtract.radius = value
@export_range(0, 100, 0.001) var end_target_distance: float = 15.0:
	set(value):
		value = abs(value)
		%PointEndTarget.radius = value
@export var visible_debug_target_ranges: bool = true:
	set(value):
		%PointToTarget.visible = value
		%PointEndTarget.visible = value
		%PointEndTargetSubtract.visible = value


@onready var point_to_target: CSGCylinder3D = %PointToTarget
@onready var point_end_target: CSGCylinder3D = %PointEndTarget
@onready var point_end_target_subtract: CSGCylinder3D = %PointEndTargetSubtract

@onready var marker_target: Marker3D = %MarkerTarget ## The object whose position the player will be targeting.


var player_in_range: bool = false ## Keeps track of if the player is within targetable range.



func _ready() -> void:
	change_target_range(to_target_distance, end_target_distance)
	debug_visibility_target_range(visible_debug_target_ranges)

	if has_node(".."):
		get_parent().add_to_group("targetable")


func change_target_range(new_to_target_range: float, new_end_target_range: float) -> void:
	point_to_target.radius = new_to_target_range
	point_end_target.radius = new_end_target_range
	point_end_target_subtract.radius = new_to_target_range


func debug_visibility_target_range(enable: bool) -> void:
	point_to_target.visible = enable
	point_end_target.visible = enable
	point_end_target_subtract.visible = enable

Is there some way to get this to behave correctly?

Your setter functions must also set the variable

@export_range(0, 100, 0.001) var to_target_distance: float = 5.0:
	set(value):
		value = abs(value)
		to_target_distance = value # apply value to the variable

The setter may also run before _ready as @export properties are processed before the node is ready, that is likely why $PointToTarget fails

That makes a lot of sense! I’m a little embarrassed I didn’t catch that. Thank you!! ^^