From e2bb5ec656e91c5d180894d2d54c3d6baccaa5b2 Mon Sep 17 00:00:00 2001 From: Steven Long Date: Wed, 19 Jul 2023 09:40:16 -0700 Subject: [PATCH] Add collision detection --- Sandbox.csproj | 7 +- Scenes/Blizzard.tscn | 23 ++++-- Scenes/Main.tscn | 34 ++++---- Scenes/fireball.tscn | 33 +++++--- Scripts/CameraSystem.cs | 78 +++++++++--------- Scripts/Cookie.obj.import | 21 ----- Scripts/Enemy.cs | 13 +++ Scripts/Fireball.cs | 8 +- Scripts/Player.cs | 168 +++++++++++++++++++------------------- Scripts/Projectile.cs | 26 +++--- 10 files changed, 213 insertions(+), 198 deletions(-) delete mode 100644 Scripts/Cookie.obj.import create mode 100644 Scripts/Enemy.cs diff --git a/Sandbox.csproj b/Sandbox.csproj index 101e97a..4572533 100644 --- a/Sandbox.csproj +++ b/Sandbox.csproj @@ -1,4 +1,4 @@ - + net6.0 true @@ -6,4 +6,9 @@ + + + + + \ No newline at end of file diff --git a/Scenes/Blizzard.tscn b/Scenes/Blizzard.tscn index f9b3282..be13045 100644 --- a/Scenes/Blizzard.tscn +++ b/Scenes/Blizzard.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=4 format=3 uid="uid://ds2y8l8onrs4f"] +[gd_scene load_steps=5 format=3 uid="uid://ds2y8l8onrs4f"] [ext_resource type="Script" path="res://Scripts/Blizzard.cs" id="1_rqtsv"] @@ -9,19 +9,24 @@ albedo_color = Color(0.137255, 0.447059, 0.796078, 1) radial_segments = 4 rings = 1 +[sub_resource type="SphereShape3D" id="SphereShape3D_xe0sc"] + [node name="Blizzard" type="Node3D"] script = ExtResource("1_rqtsv") -Cooldown = 1.0 _projectileSpeed = 10.0 -[node name="MeshInstance3D" type="MeshInstance3D" parent="."] +[node name="RigidBody3D" type="RigidBody3D" parent="."] +collision_layer = 0 +collision_mask = 16 +mass = 0.01 +gravity_scale = 0.0 + +[node name="MeshInstance3D" type="MeshInstance3D" parent="RigidBody3D"] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.11373, 0) material_override = SubResource("StandardMaterial3D_pd0mo") mesh = SubResource("SphereMesh_g0pbs") +skeleton = NodePath("../..") -[node name="TimeToLive" type="Timer" parent="."] -wait_time = 2.5 -one_shot = true -autostart = true - -[connection signal="timeout" from="TimeToLive" to="." method="OnTimeToLiveTimeout"] +[node name="CollisionShape3D" type="CollisionShape3D" parent="RigidBody3D"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.11958, 0) +shape = SubResource("SphereShape3D_xe0sc") diff --git a/Scenes/Main.tscn b/Scenes/Main.tscn index 42dc480..a2c475c 100644 --- a/Scenes/Main.tscn +++ b/Scenes/Main.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=18 format=3 uid="uid://bcsgd8vxy43g2"] +[gd_scene load_steps=19 format=3 uid="uid://bcsgd8vxy43g2"] [ext_resource type="Script" path="res://Scripts/Player.cs" id="1_8dc05"] [ext_resource type="PackedScene" uid="uid://d20uxkpid4ynd" path="res://Models/vivi1.gltf" id="1_mqt2m"] @@ -9,6 +9,7 @@ [ext_resource type="Script" path="res://Scripts/NPCFollow.cs" id="4_o5mpp"] [ext_resource type="Script" path="res://Scripts/DebugText.cs" id="8_ksx3s"] [ext_resource type="ArrayMesh" uid="uid://35saq7eyk446" path="res://Models/Cookie.obj" id="8_p45nj"] +[ext_resource type="Script" path="res://Scripts/Enemy.cs" id="9_0gfg2"] [sub_resource type="BoxShape3D" id="BoxShape3D_8verc"] size = Vector3(100, 2, 100) @@ -116,22 +117,27 @@ material_override = SubResource("StandardMaterial3D_ultw4") use_collision = true size = Vector3(15.0266, 4.74018, 1) -[node name="CharacterBody3D" type="CharacterBody3D" parent="."] -collision_layer = 0 -collision_mask = 16 - -[node name="Cookie" type="MeshInstance3D" parent="CharacterBody3D"] -transform = Transform3D(0.2, 0, 0, 0, 0.2, 0, 0, 0, 0.2, -8.04457, -0.130408, -1.66095) -mesh = ExtResource("8_p45nj") -skeleton = NodePath("../..") - -[node name="CollisionShape3D" type="CollisionShape3D" parent="CharacterBody3D"] -transform = Transform3D(0.2, 0, 0, 0, 0.2, 0, 0, 0, 0.2, -8.04457, 0.690081, -1.66095) -shape = SubResource("CapsuleShape3D_y33ih") - [node name="DebugUI" type="Node2D" parent="."] [node name="TextEdit" type="TextEdit" parent="DebugUI"] offset_right = 3468.0 offset_bottom = 777.0 script = ExtResource("8_ksx3s") + +[node name="RigidBody3D" type="RigidBody3D" parent="."] +collision_layer = 0 +collision_mask = 17 +max_contacts_reported = 10 +contact_monitor = true +script = ExtResource("9_0gfg2") + +[node name="Cookie" type="MeshInstance3D" parent="RigidBody3D"] +transform = Transform3D(0.2, 0, 0, 0, 0.2, 0, 0, 0, 0.2, -8.04457, -0.130408, -1.66095) +mesh = ExtResource("8_p45nj") +skeleton = NodePath("../..") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="RigidBody3D"] +transform = Transform3D(0.2, 0, 0, 0, 0.2, 0, 0, 0, 0.2, -8.04457, 0.690081, -1.66095) +shape = SubResource("CapsuleShape3D_y33ih") + +[connection signal="body_entered" from="RigidBody3D" to="RigidBody3D" method="OnHit"] diff --git a/Scenes/fireball.tscn b/Scenes/fireball.tscn index 2cffca3..00027e3 100644 --- a/Scenes/fireball.tscn +++ b/Scenes/fireball.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=4 format=3 uid="uid://dg7731nx22ewp"] +[gd_scene load_steps=5 format=3 uid="uid://dg7731nx22ewp"] [ext_resource type="Script" path="res://Scripts/Fireball.cs" id="1_4ipg4"] @@ -7,19 +7,26 @@ albedo_color = Color(0.666667, 0, 0.239216, 1) [sub_resource type="SphereMesh" id="SphereMesh_6bhr7"] -[node name="Fireball" type="Node3D"] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.916843, 0) -script = ExtResource("1_4ipg4") -Cooldown = 0.3 -_projectileSpeed = 20.0 +[sub_resource type="SphereShape3D" id="SphereShape3D_64t08"] +radius = 0.51754 -[node name="MeshInstance3D" type="MeshInstance3D" parent="."] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.00392, 0) +[node name="RigidBody3D" type="RigidBody3D"] +collision_layer = 16 +gravity_scale = 0.0 +max_contacts_reported = 5 +contact_monitor = true +script = ExtResource("1_4ipg4") +_projectileSpeed = 10.0 + +[node name="Fireball" type="Node3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.916843, 0) + +[node name="MeshInstance3D" type="MeshInstance3D" parent="Fireball"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.0870771, 0) material_override = SubResource("StandardMaterial3D_jxwqo") mesh = SubResource("SphereMesh_6bhr7") +skeleton = NodePath("../../..") -[node name="TimeToLive" type="Timer" parent="."] -one_shot = true -autostart = true - -[connection signal="timeout" from="TimeToLive" to="." method="OnTimeToLiveTimeout"] +[node name="CollisionShape3D" type="CollisionShape3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.00448, 0.081282) +shape = SubResource("SphereShape3D_64t08") diff --git a/Scripts/CameraSystem.cs b/Scripts/CameraSystem.cs index aae25c5..2684da6 100644 --- a/Scripts/CameraSystem.cs +++ b/Scripts/CameraSystem.cs @@ -2,49 +2,49 @@ using Godot; public partial class CameraSystem : SpringArm3D { - [Export] - private float _sensitivityHorizontal = 0.05f; - [Export] - private float _sensitivityVertical = 0.05f; - [Export] - private float _joystickDeadZone = 0.5f; + [Export] + private float _sensitivityHorizontal = 0.05f; + [Export] + private float _sensitivityVertical = 0.05f; + [Export] + private float _joystickDeadZone = 0.5f; - private Node3D _pivot; - private CharacterBody3D _characterBody; + private Node3D _pivot; + private CharacterBody3D _characterBody; - public override void _Ready() - { - _pivot = GetNode("/root/Main/Player/Pivot"); - _characterBody = GetNode("/root/Main/Player"); - } + public override void _Ready() + { + _pivot = GetNode("/root/Main/Player/Pivot"); + _characterBody = GetNode("/root/Main/Player"); + } - public override void _Process(double delta) - { - var joyRightX = Input.GetJoyAxis(0, JoyAxis.RightX); - var joyRightY = Input.GetJoyAxis(0, JoyAxis.RightY); + public override void _Process(double delta) + { + var joyRightX = Input.GetJoyAxis(0, JoyAxis.RightX); + var joyRightY = Input.GetJoyAxis(0, JoyAxis.RightY); - if (Mathf.Abs(joyRightX) > _joystickDeadZone) - { - var rotateAmount = joyRightX * _sensitivityHorizontal; - _characterBody.RotateY(-rotateAmount); - _pivot.RotateY(rotateAmount); - } + if (Mathf.Abs(joyRightX) > _joystickDeadZone) + { + var rotateAmount = joyRightX * _sensitivityHorizontal; + _characterBody.RotateY(-rotateAmount); + _pivot.RotateY(rotateAmount); + } - if (Mathf.Abs(joyRightY) > _joystickDeadZone) - { - RotateX(joyRightY * _sensitivityVertical); - Rotation = new Vector3(Mathf.Clamp(Rotation.X, -0.7f, 0.7f), Rotation.Y, Rotation.Z); - } - } + if (Mathf.Abs(joyRightY) > _joystickDeadZone) + { + RotateX(joyRightY * _sensitivityVertical); + Rotation = new Vector3(Mathf.Clamp(Rotation.X, -0.7f, 0.7f), Rotation.Y, Rotation.Z); + } + } - public override void _Input(InputEvent @event) - { - if (@event is InputEventMouseMotion mouseMotion) - { - _characterBody.RotateY(Mathf.DegToRad(-mouseMotion.Relative.X * _sensitivityHorizontal)); - _pivot.RotateY(Mathf.DegToRad(mouseMotion.Relative.X * _sensitivityHorizontal)); - RotateX(Mathf.DegToRad(mouseMotion.Relative.Y * _sensitivityVertical)); - Rotation = new Vector3(Mathf.Clamp(Rotation.X, -0.7f, 0.7f), Rotation.Y, Rotation.Z); - } - } + public override void _Input(InputEvent @event) + { + if (@event is InputEventMouseMotion mouseMotion) + { + _characterBody.RotateY(Mathf.DegToRad(-mouseMotion.Relative.X * _sensitivityHorizontal)); + _pivot.RotateY(Mathf.DegToRad(mouseMotion.Relative.X * _sensitivityHorizontal)); + RotateX(Mathf.DegToRad(mouseMotion.Relative.Y * _sensitivityVertical)); + Rotation = new Vector3(Mathf.Clamp(Rotation.X, -0.7f, 0.7f), Rotation.Y, Rotation.Z); + } + } } diff --git a/Scripts/Cookie.obj.import b/Scripts/Cookie.obj.import deleted file mode 100644 index fc8ca5a..0000000 --- a/Scripts/Cookie.obj.import +++ /dev/null @@ -1,21 +0,0 @@ -[remap] - -importer="wavefront_obj" -importer_version=1 -type="Mesh" -uid="uid://cj246dmena0if" -path="res://.godot/imported/Cookie.obj-9c7fa2a3d48746d9f2fd322d3854502d.mesh" - -[deps] - -files=["res://.godot/imported/Cookie.obj-9c7fa2a3d48746d9f2fd322d3854502d.mesh"] - -source_file="res://Scripts/Cookie.obj" -dest_files=["res://.godot/imported/Cookie.obj-9c7fa2a3d48746d9f2fd322d3854502d.mesh", "res://.godot/imported/Cookie.obj-9c7fa2a3d48746d9f2fd322d3854502d.mesh"] - -[params] - -generate_tangents=true -scale_mesh=Vector3(1, 1, 1) -offset_mesh=Vector3(0, 0, 0) -optimize_mesh=true diff --git a/Scripts/Enemy.cs b/Scripts/Enemy.cs new file mode 100644 index 0000000..853a43f --- /dev/null +++ b/Scripts/Enemy.cs @@ -0,0 +1,13 @@ +using Godot; + +public partial class Enemy : Node +{ + public void OnHit(Variant body) + { + if (body.Obj is Projectile) + { + GD.Print("Hit"); + QueueFree(); + } + } +} diff --git a/Scripts/Fireball.cs b/Scripts/Fireball.cs index a8519bc..422c4da 100644 --- a/Scripts/Fireball.cs +++ b/Scripts/Fireball.cs @@ -2,8 +2,8 @@ using Godot; public partial class Fireball : Projectile { - public override void _PhysicsProcess(double delta) - { - Translate(new Vector3(0, 0, Speed * (float)delta)); - } + public override void _PhysicsProcess(double delta) + { + Translate(new Vector3(0, 0, Speed * (float)delta)); + } } diff --git a/Scripts/Player.cs b/Scripts/Player.cs index dffac5c..a9d9186 100644 --- a/Scripts/Player.cs +++ b/Scripts/Player.cs @@ -4,102 +4,102 @@ using Godot.Collections; public partial class Player : CharacterBody3D { - [Export] - private float _speed = 5.0f; - [Export] - private float _jumpVelocity = 4.5f; - [Export] - private float _sensitivityHorizontal = 0.05f; - [Export] - private float _sensitivityVertical = 0.05f; - [Export] - private float _joystickDeadZone = 0.5f; - [Export] - private Array _projectiles; + [Export] + private float _speed = 5.0f; + [Export] + private float _jumpVelocity = 4.5f; + [Export] + private float _sensitivityHorizontal = 0.05f; + [Export] + private float _sensitivityVertical = 0.05f; + [Export] + private float _joystickDeadZone = 0.5f; + [Export] + private Array _projectiles; - public bool CanShoot { get; private set; } + public bool CanShoot { get; private set; } - private Node3D _cameraMount; - private Node3D _pivot; - private Node3D _camera; - private PackedScene _weaponType; + private Node3D _cameraMount; + private Node3D _pivot; + private Node3D _camera; + private PackedScene _weaponType; - // Get the _gravity from the project settings to be synced with RigidBody nodes. - public float _gravity = ProjectSettings.GetSetting("physics/3d/default_gravity").AsSingle(); + // Get the _gravity from the project settings to be synced with RigidBody nodes. + public float _gravity = ProjectSettings.GetSetting("physics/3d/default_gravity").AsSingle(); - public override void _Ready() - { - Input.MouseMode = Input.MouseModeEnum.Captured; - _cameraMount = GetNode("/root/Main/Player/CameraMount"); - _camera = GetNode("/root/Main/Player/CameraMount/Camera"); - _pivot = GetNode("/root/Main/Player/Pivot"); - _weaponType = _projectiles.First(); - CanShoot = true; - } + public override void _Ready() + { + Input.MouseMode = Input.MouseModeEnum.Captured; + _cameraMount = GetNode("/root/Main/Player/CameraMount"); + _camera = GetNode("/root/Main/Player/CameraMount/Camera"); + _pivot = GetNode("/root/Main/Player/Pivot"); + _weaponType = _projectiles.First(); + CanShoot = true; + } - public override void _Process(double delta) - { - if (Input.IsActionJustPressed("quit")) - GetTree().Quit(); - if (Input.IsActionJustPressed("shoot") && CanShoot) - Shoot(); - if (Input.IsActionJustPressed("switch")) - SwitchWeaponType(); - } + public override void _Process(double delta) + { + if (Input.IsActionJustPressed("quit")) + GetTree().Quit(); + if (Input.IsActionJustPressed("shoot") && CanShoot) + Shoot(); + if (Input.IsActionJustPressed("switch")) + SwitchWeaponType(); + } - public override void _PhysicsProcess(double delta) - { - var gravityDelta = _gravity * (float)delta; - var velocity = CalculateMovement(Velocity, Transform, gravityDelta); + public override void _PhysicsProcess(double delta) + { + var gravityDelta = _gravity * (float)delta; + var velocity = CalculateMovement(Velocity, Transform, gravityDelta); - Velocity = velocity; - MoveAndSlide(); - } + Velocity = velocity; + MoveAndSlide(); + } - private async void Shoot() - { - GD.Print("Shoot"); - var projectile = _weaponType.Instantiate(); - projectile.Position = Position; - projectile.Rotation = Rotation; - GetParent().AddChild(projectile); - CanShoot = false; - await ToSignal(GetTree().CreateTimer(projectile.Cooldown), "timeout"); - CanShoot = true; - } + private async void Shoot() + { + GD.Print("Shoot"); + var projectile = _weaponType.Instantiate(); + projectile.Position = Position; + projectile.Rotation = Rotation; + GetParent().AddChild(projectile); + CanShoot = false; + await ToSignal(GetTree().CreateTimer(projectile.Cooldown), "timeout"); + CanShoot = true; + } - private async void SwitchWeaponType() - { - var index = _projectiles.IndexOf(_weaponType); - _weaponType = _projectiles[(index + 1) % _projectiles.Count]; - CanShoot = false; - await ToSignal(GetTree().CreateTimer(.5), "timeout"); - CanShoot = true; + private async void SwitchWeaponType() + { + var index = _projectiles.IndexOf(_weaponType); + _weaponType = _projectiles[(index + 1) % _projectiles.Count]; + CanShoot = false; + await ToSignal(GetTree().CreateTimer(.5), "timeout"); + CanShoot = true; - } + } - private Vector3 CalculateMovement(Vector3 velocity, Transform3D transform, float gravityDelta) - { - if (!IsOnFloor()) - velocity.Y -= gravityDelta; + private Vector3 CalculateMovement(Vector3 velocity, Transform3D transform, float gravityDelta) + { + if (!IsOnFloor()) + velocity.Y -= gravityDelta; - if (Input.IsActionJustPressed("jump") && IsOnFloor()) - velocity.Y = _jumpVelocity; + if (Input.IsActionJustPressed("jump") && IsOnFloor()) + velocity.Y = _jumpVelocity; - Vector2 inputDir = Input.GetVector("right", "left", "back", "forward"); - Vector3 direction = (transform.Basis * new Vector3(inputDir.X, 0, inputDir.Y)).Normalized(); - if (direction != Vector3.Zero) - { - velocity.X = direction.X * _speed; - velocity.Z = direction.Z * _speed; - GetNode("Pivot").LookAt(Position + direction.Normalized(), Vector3.Up); - } - else - { - velocity.X = Mathf.MoveToward(Velocity.X, 0, _speed); - velocity.Z = Mathf.MoveToward(Velocity.Z, 0, _speed); - } + Vector2 inputDir = Input.GetVector("right", "left", "back", "forward"); + Vector3 direction = (transform.Basis * new Vector3(inputDir.X, 0, inputDir.Y)).Normalized(); + if (direction != Vector3.Zero) + { + velocity.X = direction.X * _speed; + velocity.Z = direction.Z * _speed; + GetNode("Pivot").LookAt(Position + direction.Normalized(), Vector3.Up); + } + else + { + velocity.X = Mathf.MoveToward(Velocity.X, 0, _speed); + velocity.Z = Mathf.MoveToward(Velocity.Z, 0, _speed); + } - return velocity; - } + return velocity; + } } diff --git a/Scripts/Projectile.cs b/Scripts/Projectile.cs index f96b1b3..3d5e356 100644 --- a/Scripts/Projectile.cs +++ b/Scripts/Projectile.cs @@ -2,21 +2,21 @@ public partial class Projectile : Node3D { - [Export] - public double Cooldown { get; protected set; } + [Export] + public double Cooldown { get; protected set; } - [Export] - private float _projectileSpeed = 0.1f; + [Export] + private float _projectileSpeed = 100f; - public override void _Ready() - { - Speed = _projectileSpeed; - } + public override void _Ready() + { + Speed = _projectileSpeed; + } - public float Speed { get; private set; } + public float Speed { get; private set; } - public void OnTimeToLiveTimeout() - { - QueueFree(); - } + public void OnTimeToLiveTimeout() + { + QueueFree(); + } }