From b396629e902be3d7ee4ec685576495b03c7a2dae Mon Sep 17 00:00:00 2001 From: Sascha Date: Mon, 23 Oct 2023 10:41:36 +0200 Subject: [PATCH] Create explosion GPUParticle system --- Godot-space Shooter.csproj | 2 +- Godot-space Shooter.csproj.old.5 | 2 +- Material/explosion.tres | 10 +++++ Packed-Scenes/asteroid_01.tscn | 16 ++------ Packed-Scenes/asteroid_02.tscn | 16 ++------ Packed-Scenes/asteroid_03.tscn | 16 ++------ Packed-Scenes/explosion.tscn | 68 ++++++++++++++++++++++++++++++++ Scripts/Asteroid.cs | 11 ++++-- Scripts/Explosion.cs | 8 ++++ Shader/explosion.gdshader | 9 +++++ 10 files changed, 117 insertions(+), 41 deletions(-) create mode 100644 Material/explosion.tres create mode 100644 Packed-Scenes/explosion.tscn create mode 100644 Scripts/Explosion.cs create mode 100644 Shader/explosion.gdshader diff --git a/Godot-space Shooter.csproj b/Godot-space Shooter.csproj index 0c5959c..5a8539f 100644 --- a/Godot-space Shooter.csproj +++ b/Godot-space Shooter.csproj @@ -1,4 +1,4 @@ - + net6.0 true diff --git a/Godot-space Shooter.csproj.old.5 b/Godot-space Shooter.csproj.old.5 index 0c5959c..5a8539f 100644 --- a/Godot-space Shooter.csproj.old.5 +++ b/Godot-space Shooter.csproj.old.5 @@ -1,4 +1,4 @@ - + net6.0 true diff --git a/Material/explosion.tres b/Material/explosion.tres new file mode 100644 index 0000000..648fe15 --- /dev/null +++ b/Material/explosion.tres @@ -0,0 +1,10 @@ +[gd_resource type="SphereMesh" load_steps=2 format=3 uid="uid://c1bemmgv6st52"] + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_mh4r4"] +albedo_color = Color(1, 1, 0, 0.419608) +emission_enabled = true +emission = Color(1, 0, 0, 1) +emission_energy_multiplier = 10.0 + +[resource] +material = SubResource("StandardMaterial3D_mh4r4") diff --git a/Packed-Scenes/asteroid_01.tscn b/Packed-Scenes/asteroid_01.tscn index 049dbc5..e09a225 100644 --- a/Packed-Scenes/asteroid_01.tscn +++ b/Packed-Scenes/asteroid_01.tscn @@ -1,7 +1,8 @@ -[gd_scene load_steps=11 format=3 uid="uid://6dn1gjqffnt"] +[gd_scene load_steps=10 format=3 uid="uid://6dn1gjqffnt"] [ext_resource type="Script" path="res://Scripts/Asteroid.cs" id="1_ygr21"] [ext_resource type="Texture2D" uid="uid://bt2aj3hcmb87q" path="res://Textures/prop_asteroid_01_dff.png" id="1_yruod"] +[ext_resource type="PackedScene" uid="uid://chkv84s8orhbr" path="res://Packed-Scenes/explosion.tscn" id="2_d3riq"] [ext_resource type="Texture2D" uid="uid://swmr1hw148bp" path="res://Textures/prop_asteroid_01_nrm.png" id="2_xbjvi"] [sub_resource type="SphereShape3D" id="SphereShape3D_leouh"] @@ -52,16 +53,12 @@ normal_enabled = true normal_scale = 2.0 normal_texture = ExtResource("2_xbjvi") -[sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_615d1"] - -[sub_resource type="SphereMesh" id="SphereMesh_28y08"] - -[node name="Asteroid_01" type="Node3D" node_paths=PackedStringArray("asteroidRb", "asteroidMesh", "explosion")] +[node name="Asteroid_01" type="Node3D" node_paths=PackedStringArray("asteroidRb", "asteroidMesh")] transform = Transform3D(0.25, 0, 0, 0, 0.25, 0, 0, 0, 0.25, 0, 0, 0) script = ExtResource("1_ygr21") asteroidRb = NodePath("RigidBody3D") asteroidMesh = NodePath("RigidBody3D/prop_asteroid_01") -explosion = NodePath("RigidBody3D/Explosion") +explosion = ExtResource("2_d3riq") [node name="RigidBody3D" type="RigidBody3D" parent="."] gravity_scale = 0.0 @@ -74,8 +71,3 @@ transform = Transform3D(1, 0, 0, 0, 0, 1, 0, -1, 0, 0, 0, 0) mesh = SubResource("ArrayMesh_rks3f") skeleton = NodePath("") surface_material_override/0 = SubResource("StandardMaterial3D_32257") - -[node name="Explosion" type="GPUParticles3D" parent="RigidBody3D"] -emitting = false -process_material = SubResource("ParticleProcessMaterial_615d1") -draw_pass_1 = SubResource("SphereMesh_28y08") diff --git a/Packed-Scenes/asteroid_02.tscn b/Packed-Scenes/asteroid_02.tscn index b86b9cf..262d92d 100644 --- a/Packed-Scenes/asteroid_02.tscn +++ b/Packed-Scenes/asteroid_02.tscn @@ -1,16 +1,13 @@ -[gd_scene load_steps=11 format=3 uid="uid://cvlxm2yrohsca"] +[gd_scene load_steps=10 format=3 uid="uid://cvlxm2yrohsca"] [ext_resource type="Texture2D" uid="uid://c48y5hkprbmre" path="res://Textures/prop_asteroid_02_dff.png" id="1_hvwuc"] [ext_resource type="Script" path="res://Scripts/Asteroid.cs" id="1_vm3mg"] +[ext_resource type="PackedScene" uid="uid://chkv84s8orhbr" path="res://Packed-Scenes/explosion.tscn" id="2_m7nsk"] [ext_resource type="Texture2D" uid="uid://8uqgmlpi6x21" path="res://Textures/prop_asteroid_02_nrm.png" id="2_qs4n0"] [sub_resource type="SphereShape3D" id="SphereShape3D_f4akn"] radius = 0.715 -[sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_eput4"] - -[sub_resource type="SphereMesh" id="SphereMesh_p3hrp"] - [sub_resource type="StandardMaterial3D" id="StandardMaterial3D_n7ttt"] resource_name = "prop_asteroid_02_mat" metallic = 0.4 @@ -56,12 +53,12 @@ normal_enabled = true normal_scale = 2.0 normal_texture = ExtResource("2_qs4n0") -[node name="Asteroid_02" type="Node3D" node_paths=PackedStringArray("asteroidRb", "asteroidMesh", "explosion")] +[node name="Asteroid_02" type="Node3D" node_paths=PackedStringArray("asteroidRb", "asteroidMesh")] transform = Transform3D(0.25, 0, 0, 0, 0.25, 0, 0, 0, 0.25, 0, 0, 0) script = ExtResource("1_vm3mg") asteroidRb = NodePath("RigidBody3D") asteroidMesh = NodePath("RigidBody3D/prop_asteroid_02") -explosion = NodePath("RigidBody3D/Explosion") +explosion = ExtResource("2_m7nsk") [node name="RigidBody3D" type="RigidBody3D" parent="."] gravity_scale = 0.0 @@ -69,11 +66,6 @@ gravity_scale = 0.0 [node name="CollisionShape3D" type="CollisionShape3D" parent="RigidBody3D"] shape = SubResource("SphereShape3D_f4akn") -[node name="Explosion" type="GPUParticles3D" parent="RigidBody3D"] -emitting = false -process_material = SubResource("ParticleProcessMaterial_eput4") -draw_pass_1 = SubResource("SphereMesh_p3hrp") - [node name="prop_asteroid_02" type="MeshInstance3D" parent="RigidBody3D"] transform = Transform3D(1, 0, 0, 0, 0, 1, 0, -1, 0, 0, 0, 0) mesh = SubResource("ArrayMesh_jk0jt") diff --git a/Packed-Scenes/asteroid_03.tscn b/Packed-Scenes/asteroid_03.tscn index e6d4714..412427b 100644 --- a/Packed-Scenes/asteroid_03.tscn +++ b/Packed-Scenes/asteroid_03.tscn @@ -1,16 +1,13 @@ -[gd_scene load_steps=11 format=3 uid="uid://brqqgidqchi88"] +[gd_scene load_steps=10 format=3 uid="uid://brqqgidqchi88"] [ext_resource type="Script" path="res://Scripts/Asteroid.cs" id="1_ph38x"] [ext_resource type="Texture2D" uid="uid://4sc40fjd4myy" path="res://Textures/prop_asteroid_03_dff.png" id="1_wdgmr"] +[ext_resource type="PackedScene" uid="uid://chkv84s8orhbr" path="res://Packed-Scenes/explosion.tscn" id="2_00f7o"] [ext_resource type="Texture2D" uid="uid://qy0a83vkelqe" path="res://Textures/prop_asteroid_03_nrm.png" id="2_5yqc5"] [sub_resource type="SphereShape3D" id="SphereShape3D_iq8kl"] radius = 0.847 -[sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_6ipvl"] - -[sub_resource type="SphereMesh" id="SphereMesh_1s5ky"] - [sub_resource type="StandardMaterial3D" id="StandardMaterial3D_pvmxy"] resource_name = "prop_asteroid_03_mat" metallic = 0.4 @@ -56,12 +53,12 @@ normal_enabled = true normal_scale = 2.0 normal_texture = ExtResource("2_5yqc5") -[node name="Asteroid_03" type="Node3D" node_paths=PackedStringArray("asteroidRb", "asteroidMesh", "explosion")] +[node name="Asteroid_03" type="Node3D" node_paths=PackedStringArray("asteroidRb", "asteroidMesh")] transform = Transform3D(0.25, 0, 0, 0, 0.25, 0, 0, 0, 0.25, 0, 0, 0) script = ExtResource("1_ph38x") asteroidRb = NodePath("RigidBody3D") asteroidMesh = NodePath("RigidBody3D/prop_asteroid_03") -explosion = NodePath("RigidBody3D/Explosion") +explosion = ExtResource("2_00f7o") [node name="RigidBody3D" type="RigidBody3D" parent="."] gravity_scale = 0.0 @@ -69,11 +66,6 @@ gravity_scale = 0.0 [node name="CollisionShape3D" type="CollisionShape3D" parent="RigidBody3D"] shape = SubResource("SphereShape3D_iq8kl") -[node name="Explosion" type="GPUParticles3D" parent="RigidBody3D"] -emitting = false -process_material = SubResource("ParticleProcessMaterial_6ipvl") -draw_pass_1 = SubResource("SphereMesh_1s5ky") - [node name="prop_asteroid_03" type="MeshInstance3D" parent="RigidBody3D"] mesh = SubResource("ArrayMesh_rnkma") skeleton = NodePath("") diff --git a/Packed-Scenes/explosion.tscn b/Packed-Scenes/explosion.tscn new file mode 100644 index 0000000..5348f98 --- /dev/null +++ b/Packed-Scenes/explosion.tscn @@ -0,0 +1,68 @@ +[gd_scene load_steps=11 format=3 uid="uid://chkv84s8orhbr"] + +[ext_resource type="SphereMesh" uid="uid://c1bemmgv6st52" path="res://Material/explosion.tres" id="1_6sgsn"] +[ext_resource type="Script" path="res://Scripts/Explosion.cs" id="2_y6oxt"] + +[sub_resource type="Curve" id="Curve_i7efe"] +_data = [Vector2(0, 1), 0.0, 0.0, 0, 0, Vector2(1, 0), 0.0, 0.0, 0, 0] +point_count = 2 + +[sub_resource type="CurveTexture" id="CurveTexture_xp5x6"] +curve = SubResource("Curve_i7efe") + +[sub_resource type="Curve" id="Curve_43f32"] +_data = [Vector2(0, 1), 0.0, 0.0, 0, 0, Vector2(1, 0), 0.0, 0.0, 0, 0] +point_count = 2 + +[sub_resource type="CurveTexture" id="CurveTexture_s7b1r"] +curve = SubResource("Curve_43f32") + +[sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_ssaw8"] +emission_shape = 1 +emission_sphere_radius = 1.0 +radial_velocity_min = 1.0 +radial_velocity_max = 2.0 +radial_velocity_curve = SubResource("CurveTexture_xp5x6") +gravity = Vector3(0, 0, 0) +scale_min = 0.01 +scale_max = 0.04 +scale_curve = SubResource("CurveTexture_s7b1r") +turbulence_noise_strength = 0.5 +turbulence_influence_max = 0.2 +collision_mode = 2 +collision_use_scale = true +sub_emitter_mode = 3 +sub_emitter_amount_at_collision = 32 +sub_emitter_keep_velocity = true + +[sub_resource type="Curve" id="Curve_w41ea"] +_data = [Vector2(0, 1), 0.0, 0.0, 0, 0, Vector2(1, 0), 0.0, 0.0, 0, 0] +point_count = 2 + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_0gt11"] +albedo_color = Color(1, 1, 0, 1) +albedo_texture_msdf = true +emission_enabled = true +emission = Color(1, 0, 0, 1) +emission_energy_multiplier = 10.0 +use_particle_trails = true + +[sub_resource type="RibbonTrailMesh" id="RibbonTrailMesh_gna8o"] +material = SubResource("StandardMaterial3D_0gt11") +size = 0.2 +curve = SubResource("Curve_w41ea") + +[node name="Explosion" type="GPUParticles3D"] +emitting = false +amount = 100 +sub_emitter = NodePath(".") +lifetime = 2.0 +one_shot = true +explosiveness = 1.0 +trail_enabled = true +trail_lifetime = 1.0 +process_material = SubResource("ParticleProcessMaterial_ssaw8") +draw_passes = 2 +draw_pass_1 = ExtResource("1_6sgsn") +draw_pass_2 = SubResource("RibbonTrailMesh_gna8o") +script = ExtResource("2_y6oxt") diff --git a/Scripts/Asteroid.cs b/Scripts/Asteroid.cs index 6becf5c..a0b1471 100644 --- a/Scripts/Asteroid.cs +++ b/Scripts/Asteroid.cs @@ -5,7 +5,7 @@ namespace Scripts; public partial class Asteroid : Node3D { [Export] private RigidBody3D asteroidRb; [Export] private MeshInstance3D asteroidMesh; - [Export] private GpuParticles3D explosion; + [Export] private PackedScene explosion; private float speed; private float rotSpeed = 100f; @@ -46,8 +46,13 @@ public partial class Asteroid : Node3D { } } - public void Explode() { - explosion.Emitting = true; + private void Explode() { + if (explosion.Instantiate() is GpuParticles3D ex) { + GetParent().AddChild(ex); + ex.Position = Position; + ex.Emitting = true; + } + QueueFree(); } } diff --git a/Scripts/Explosion.cs b/Scripts/Explosion.cs new file mode 100644 index 0000000..140e866 --- /dev/null +++ b/Scripts/Explosion.cs @@ -0,0 +1,8 @@ +using Godot; + +public partial class Explosion : GpuParticles3D +{ + public override void _Process(double delta) { + if (!Emitting) QueueFree(); + } +} diff --git a/Shader/explosion.gdshader b/Shader/explosion.gdshader new file mode 100644 index 0000000..3e5be74 --- /dev/null +++ b/Shader/explosion.gdshader @@ -0,0 +1,9 @@ +shader_type particles; + +void start() { + // Called when a particle is spawned. +} + +void process() { + // Called every frame on existing particles (according to the Fixed FPS property). +}