extends Node3D @export var particle_count: int = 100 @onready var particles: GPUParticles3D = $GPUParticles3D func _ready(): print("Spray Emitter Ready!") $SprayButton.button_pressed.connect(emit_particles) setup_particles() func emit_particles(): print("Emittiere ", particle_count, " Seifenblasen!") particles.emitting = true particles.restart() func setup_particles(): # Anzahl der Partikel particles.amount = particle_count particles.lifetime = 45.0 particles.one_shot = true particles.explosiveness = 0.2 particles.visibility_aabb = AABB(Vector3(-50, -50, -50), Vector3(100, 100, 100)) # WICHTIG: Fixed FPS für gleichmäßige Bewegung particles.fixed_fps = 60 particles.interpolate = true # Process Material var material = ParticleProcessMaterial.new() # Emission - größerer Radius für mehr Abstand material.emission_shape = ParticleProcessMaterial.EMISSION_SHAPE_SPHERE material.emission_sphere_radius = 8.0 # Größer = mehr Abstand zwischen Partikeln # Initial velocity material.initial_velocity_min = 0.2 material.initial_velocity_max = 0.3 material.direction = Vector3(0, 0, 0) material.spread = 180.0 # Schwerkraft material.gravity = Vector3(0, -3.5, 0) # Sanft nach unten # Größe - jetzt runde Kugeln statt Tropfen material.scale_min = 0.5 material.scale_max = 1.0 # WICHTIG: Aspect Ratio für runde Kugeln (nicht länglich) material.scale_curve = null # Keine Größenänderung über Zeit # Luftwiderstand material.damping_min = 2.0 material.damping_max = 4.0 # Turbulenz material.turbulence_enabled = true material.turbulence_noise_strength = 0.3 material.turbulence_noise_scale = 5.0 material.turbulence_noise_speed = Vector3(0.1, 0.1, 0.1) material.turbulence_influence_min = 0.05 material.turbulence_influence_max = 0.1 # Farbe - transparent material.color = Color(0.3, 0.8, 1.0, 0.3) # Hellblau particles.process_material = material # Sphere Mesh - RUND, nicht länglich var sphere_mesh = SphereMesh.new() sphere_mesh.radial_segments = 32 # Mehr Segmente = glatter sphere_mesh.rings = 16 sphere_mesh.radius = 1.0 # Wird durch scale_min/max skaliert sphere_mesh.height = 2.0 # radius * 2 = perfekte Kugel # Material für Seifenblasen var sphere_material = StandardMaterial3D.new() # Transparenz sphere_material.transparency = BaseMaterial3D.TRANSPARENCY_ALPHA sphere_material.blend_mode = BaseMaterial3D.BLEND_MODE_MIX sphere_material.depth_draw_mode = BaseMaterial3D.DEPTH_DRAW_OPAQUE_ONLY sphere_material.cull_mode = BaseMaterial3D.CULL_BACK # Farbe - durchsichtig mit leichtem Schimmer sphere_material.albedo_color = Color(0.796, 0.937, 0.996, 0.188) # Sehr transparent! sphere_material.emission_enabled = true sphere_material.emission = Color(0.4, 0.694, 0.953, 0.2) # bläulich Leuchten sphere_material.emission_energy_multiplier = 0.15 # Reflexionen - wie echte Seifenblasen sphere_material.metallic = 0.0 sphere_material.roughness = 0.1 # Sehr glatt = starke Reflexionen sphere_material.specular_mode = BaseMaterial3D.SPECULAR_SCHLICK_GGX # Refraktion (Lichtbrechung) für Glaseffekt sphere_material.refraction_enabled = true sphere_material.refraction_scale = 0.1 sphere_material.refraction_texture_channel = BaseMaterial3D.TEXTURE_CHANNEL_GREEN # Rim Lighting - leuchtende Kanten wie bei Seifenblasen sphere_material.rim_enabled = true sphere_material.rim = 0.8 sphere_material.rim_tint = 0.5 # Fresnel - mehr Reflexion an den Rändern sphere_material.clearcoat_enabled = true sphere_material.clearcoat = 0.3 sphere_material.clearcoat_roughness = 0.01 # WICHTIG: Nicht Unshaded, damit Reflexionen funktionieren sphere_material.shading_mode = BaseMaterial3D.SHADING_MODE_PER_PIXEL sphere_mesh.material = sphere_material particles.draw_pass_1 = sphere_mesh particles.draw_passes = 1 print("Seifenblasen-Setup abgeschlossen!")