Godot Version
4.4
Question
Hello!
I have a scene called TileBase, which extends AnimatableBody3D, and looks like this:
TileBase
|- CollisionShape3D
|- Area3D
| |- CollsisionShape3D
|- MeshInstance3D
Its script is currently empty, but I will add functionality to it later on, functionality that I want each Tile to have.
# tile_base.gd
class_name TileBase
extends AnimatableBody3D
Then, I have an inherited scene TileMoving:
TileMoving
|- CollisionShape3D
|- Area3D
| |- CollsisionShape3D
|- MeshInstance3D
|- MovingComponent
With its script:
# tile_moving.gd
@tool
extends TileBase
@export var end_position_offset: Vector3:
get: return $MovingComponent.end_position_offset
set(v): $MovingComponent.end_position_offset = v
@export_range(0.0, 1000.0) var travel_time: float:
get: return $MovingComponent.travel_time
set(v): $MovingComponent.travel_time = v
@export_range(0.0, 1000.0) var pause_time: float:
get: return $MovingComponent.pause_time
set(v): $MovingComponent.pause_time = v
For reference, MovingComponent is an empty scene tree with the following script:
# moving_component.gd
@tool
class_name MovingComponent
extends Node
@export var end_position_offset: Vector3
@export var travel_time: float
@export var pause_time: float
func _ready() -> void:
if Engine.is_editor_hint():
return
start_tween()
func _process(_delta: float) -> void:
if Engine.is_editor_hint():
if owner && EditorInterface.get_selection().get_selected_nodes().has(owner):
var owner_pos = owner.position
var end_pos = owner_pos + end_position_offset
DebugDraw3D.draw_aabb_ab(end_pos, end_pos + Vector3(2.0, 0.5, 2.0))
return
func start_tween() -> void:
var tween = get_tree().create_tween().set_process_mode(Tween.TWEEN_PROCESS_PHYSICS)
tween.set_loops().set_parallel(false)
var start_position = owner.position
var end_position = start_position + end_position_offset
tween.tween_interval(pause_time)
tween.tween_property(owner, "position", end_position, travel_time)
tween.tween_interval(pause_time)
tween.tween_property(owner, "position", start_position, travel_time)
The issue I’m encountering, is that tile_moving.gd generates errors where I’m accessing $MovingComponent. It says Node not found: "MovingComponent" (relative to TileBase). But I don’t understand why it’s searching relative to TileBase, that’s not where the script is attached. Sure TileMoving is extending TileBase, but I’d expect the script attached to node TileMoving to search relative to TileMoving!
What am I doing wrong here? How can I fix this issue?
Thanks!