vrp-gruppe-sechs/disco-escape-roomv-5/bubbles.gd

117 lines
3.8 KiB
GDScript

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!")