I have a tool script with an exported variable:
tool
extends Spatial
class_name Satellite
export var orbit_radius = 30.0
func _ready():
var mesh = get_node("MeshInstance")
mesh.transform.origin = Vector3(orbit_radius, 0, 0)
In the Editor, however, the mesh is always at (0, 0, 0). When I run the game, the mesh will appear at its proper destination, e.g. (30, 0, 0).
How can I have the value of orbit_radius
affect the position of the mesh in the 3D editor?
================
EDIT:
Based on Lopy's answer, I changed the code to this:
tool
extends Spatial
class_name Satellite
export var orbit_radius = 30.0 setget _set_radius
var mesh
func _ready():
if mesh == null:
mesh = get_node("MeshInstance")
func _set_radius(value):
orbit_radius = value
if mesh == null:
mesh = get_node("MeshInstance")
mesh.transform.origin = Vector3(orbit_radius, 0, 0)
I placed a breakpoint in the line mesh = get_node("MeshInstance")
of the _ready() function. The line does not even execute before I get an error:
E 0:00:00.654 get_node: Node not found: MeshInstance. <C++ Error>
Condition "!node" is true. Returned: __null <C++ Source>
scene/main/node.cpp:1381 @ get_node() Satellite.gd:28
@ _set_radius()
So it seems the editor tries to run the setter before even calling _ready(), however the tree is not set up at this moment. It does work in the editor though!