extends Path3D @export_group("Impostazioni Treno") @export var velocita_treno: float = 6.0 @export var in_movimento: bool = true @export_group("Costruzione Rotaie") @export var distanza_traversine: float = 1.0 # Ogni quanti metri mettere un asse di legno var nodo_treno: PathFollow3D func _ready() -> void: # Controlla se hai disegnato il percorso if curve == null or curve.get_baked_length() == 0: print("ATTENZIONE: Devi prima disegnare i punti del Path3D!") return _costruisci_rotaie_da_zero() _costruisci_treno_da_zero() func _costruisci_rotaie_da_zero() -> void: # 1. Creiamo i materiali (Colori) per le rotaie var mat_legno = StandardMaterial3D.new() mat_legno.albedo_color = Color(0.35, 0.2, 0.1) # Marrone scuro var mat_ferro = StandardMaterial3D.new() mat_ferro.albedo_color = Color(0.6, 0.6, 0.65) # Grigio metallico mat_ferro.metallic = 0.8 # 2. Creiamo le forme geometriche base (Box) var mesh_traversina = BoxMesh.new() mesh_traversina.size = Vector3(1.8, 0.1, 0.3) var mesh_binario = BoxMesh.new() # La lunghezza del binario è uguale alla distanza tra le traversine per connettersi perfettamente mesh_binario.size = Vector3(0.1, 0.15, distanza_traversine + 0.05) # 3. Calcoliamo quanti pezzi servono var lunghezza_totale = curve.get_baked_length() var numero_pezzi = int(lunghezza_totale / distanza_traversine) # 4. Piazziamo i pezzi lungo la curva for i in range(numero_pezzi): var distanza = i * distanza_traversine var transform_punto = curve.sample_baked_with_rotation(distanza, true, true) # Nodo "Pezzo" che fa da raggruppamento var pezzo_binario = Node3D.new() pezzo_binario.transform = transform_punto add_child(pezzo_binario) # Creiamo la traversina in legno var traversina = MeshInstance3D.new() traversina.mesh = mesh_traversina traversina.material_override = mat_legno pezzo_binario.add_child(traversina) # Creiamo il binario sinistro var binario_sx = MeshInstance3D.new() binario_sx.mesh = mesh_binario binario_sx.material_override = mat_ferro binario_sx.position = Vector3(-0.6, 0.1, 0) # Spostato a sinistra e leggermente in alto pezzo_binario.add_child(binario_sx) # Creiamo il binario destro var binario_dx = MeshInstance3D.new() binario_dx.mesh = mesh_binario binario_dx.material_override = mat_ferro binario_dx.position = Vector3(0.6, 0.1, 0) # Spostato a destra e leggermente in alto pezzo_binario.add_child(binario_dx) func _costruisci_treno_da_zero() -> void: # 1. Creiamo il PathFollow che gestisce il movimento nodo_treno = PathFollow3D.new() nodo_treno.rotation_mode = PathFollow3D.ROTATION_Y # IMPORTANTE: Evita che il treno si inclini di lato nodo_treno.cubic_interp = false # Rende la velocità costante ed elimina i tremolii nodo_treno.loop = true add_child(nodo_treno) # 2. Materiali del treno var mat_carrozzeria = StandardMaterial3D.new() mat_carrozzeria.albedo_color = Color(0.8, 0.15, 0.15) # Rosso acceso var mat_vetro = StandardMaterial3D.new() mat_vetro.albedo_color = Color(0.2, 0.8, 1.0) # Azzurro # 3. Costruiamo la Base del treno var base_treno = MeshInstance3D.new() var mesh_base = BoxMesh.new() mesh_base.size = Vector3(1.4, 0.8, 3.0) base_treno.mesh = mesh_base base_treno.material_override = mat_carrozzeria base_treno.position = Vector3(0, 0.6, 0) # Alzato per stare sopra le rotaie nodo_treno.add_child(base_treno) # 4. Costruiamo la Cabina del macchinista var cabina = MeshInstance3D.new() var mesh_cabina = BoxMesh.new() mesh_cabina.size = Vector3(1.4, 1.0, 1.2) cabina.mesh = mesh_cabina cabina.material_override = mat_vetro cabina.position = Vector3(0, 1.5, -0.8) # Messa dietro e in alto nodo_treno.add_child(cabina) # 5. Costruiamo la Ciminiera (davanti) var ciminiera = MeshInstance3D.new() var mesh_ciminiera = CylinderMesh.new() mesh_ciminiera.top_radius = 0.2 mesh_ciminiera.bottom_radius = 0.3 mesh_ciminiera.height = 0.8 ciminiera.mesh = mesh_ciminiera ciminiera.material_override = mat_carrozzeria ciminiera.position = Vector3(0, 1.2, 1.0) nodo_treno.add_child(ciminiera) func _process(delta: float) -> void: # Se in movimento, fa avanzare automaticamente il nodo_treno lungo la curva if in_movimento and nodo_treno: nodo_treno.progress += velocita_treno * delta