Get positions from Node3D inside an array

Godot Version

4.4.1.stable

Question

Hello, I am trying to create a moving Area3D object that moves randomly between 5 different places aka. “points” from 1-5.
I have put the nodes in an array and that is where my predicament is.
The only thing I would like to know is how to get the x and y positions from the element that currentTarget gets from the array

extends StaticBody3D
@onready var hitbox: Area3D = $Area3D
@onready var point1: Node3D = $HitboxPath/Point1
@onready var point2: Node3D = $HitboxPath/Point2
@onready var point3: Node3D = $HitboxPath/Point3
@onready var point4: Node3D = $HitboxPath/Point4
@onready var point5: Node3D = $HitboxPath/Point5
@onready var timer: Timer = $Timer

var targets = [point1, point2, point3, point4, point5]
var currentTarget

#Select target.
func findTarget():
	var randomTarget = randi() % targets.size()
	currentTarget = targets[randomTarget]
	print(randomTarget)
	print(currentTarget)
	print(targets)

# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta: float) -> void:
	if timer.is_stopped():
		findTarget()
	#Move hitbox to target.
		if hitbox.position.x != currentTarget.position.x:
			hitbox.position.x = lerp(hitbox.position.x, currentTarget.position.x, delta * 1)
		if hitbox.position.y != currentTarget.position.y:
			hitbox.position.y = lerp(hitbox.position.y, currentTarget.position.y, delta * 1)
		else:
			timer.start()

You ought to be able to:

currentTarget = target[randi() % targets.size()]
pos: Vector3  = currentTarget.position

Those lerp(src, dst, delta * 1) calls probably aren’t going to do what you want them to. The value of delta is going to be more or less 1/60 (or one over whatever your framerate is…), so you’re requesting a very small movement.

If you actually want to lerp, you want something like:

const LERP_TIME: float = 3.5 # three and a half seconds...

var source_pos: Vector3 # Where we are at the beginning of the lerp.
var target_pos: Vector3 # Where we're lerping to.
var time:       float   = 0.0

func _process(delta: float) -> void:
    time += delta
    if time < LERP_TIME:
        position.x = lerp(source_pos.x, target_pos.x, time)
        position.y = lerp(source_pos.y, target_pos.y, time)
        position.z = lerp(source_pos.z, target_pos.z, time)
1 Like

The problem is that currentTarget just ends up being null, and currentTarget.position just gives me an error, "Invalid access to property or key ‘position’ on a base object of type ‘Nil’

Your pointX variables are all @onready but your targets is not, the array is filled before it’s elements are.

1 Like