arcadetrucker/scripts/road_manager.gd

54 lines
1.5 KiB
GDScript

extends Node3D
@export var player: CharacterBody3D
@export var spawn_distance: float = 100.0
@export var despawn_distance: float = 200.0
var road_scene = preload("res://scenes/road.tscn")
var roads = []
var road_length: float
func _ready():
# Calculate road length from existing instance
var temp_road = road_scene.instantiate()
# Get the MeshInstance3D from the road scene structure
var mesh_instance = temp_road.get_node("RoadObject") as MeshInstance3D
if mesh_instance:
var aabb = mesh_instance.mesh.get_aabb()
road_length = aabb.size.x * mesh_instance.scale.x
else:
push_error("Could not find RoadObject MeshInstance3D in road scene")
road_length = 20.0 # Fallback value
temp_road.queue_free()
# Initialize with existing road
var initial_road = $Road
roads.append(initial_road)
func _process(delta):
if not player:
return
var player_x = player.global_position.x
# Spawn new roads ahead
var last_road = roads[-1]
var last_road_end = last_road.global_position.x + road_length
if player_x + spawn_distance > last_road_end:
spawn_road(last_road_end)
# Despawn old roads behind
for road in roads.duplicate():
var road_end = road.global_position.x + road_length
if player_x - road_end > despawn_distance:
despawn_road(road)
func spawn_road(position_x: float):
var new_road = road_scene.instantiate()
new_road.global_position = Vector3(position_x, 0, 0)
add_child(new_road)
roads.append(new_road)
func despawn_road(road: Node3D):
road.queue_free()
roads.erase(road)