diff --git a/levels/physics_test/physics_test.tscn b/levels/physics_test/physics_test.tscn index c70d48f..84ae299 100644 --- a/levels/physics_test/physics_test.tscn +++ b/levels/physics_test/physics_test.tscn @@ -122,9 +122,9 @@ shape = SubResource("WorldBoundaryShape3D_6j7vt") [node name="MedBox" type="RigidBody3D" parent="."] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 6, 1.2, -6) -collision_layer = 6 +collision_layer = 7 collision_mask = 9 -mass = 10.0 +mass = 50.0 [node name="MeshInstance3D" type="MeshInstance3D" parent="MedBox"] mesh = SubResource("BoxMesh_252gx") @@ -139,9 +139,9 @@ metadata/_custom_type_script = "uid://040xta01xqxd" [node name="BigBox" type="RigidBody3D" parent="."] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 10.5, 1.8, -6) -collision_layer = 6 +collision_layer = 7 collision_mask = 9 -mass = 50.0 +mass = 500.0 [node name="MeshInstance3D" type="MeshInstance3D" parent="BigBox"] mesh = SubResource("BoxMesh_35l2h") diff --git a/src/player/player.tscn b/src/player/player.tscn index fe72962..4ac2178 100644 --- a/src/player/player.tscn +++ b/src/player/player.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=66 format=3 uid="uid://bwe2jdmvinhqd"] +[gd_scene load_steps=67 format=3 uid="uid://bwe2jdmvinhqd"] [ext_resource type="Script" uid="uid://buwh0g1ga2aka" path="res://src/player/player.gd" id="1_npueo"] [ext_resource type="Script" uid="uid://cx1yt0drthpw3" path="res://src/player/camera_controller.gd" id="2_veeqv"] @@ -35,6 +35,7 @@ [ext_resource type="AudioStream" uid="uid://djucfo3l7x7px" path="res://assets/sfx/footsteps/plastic/plastic3.wav" id="29_wcxbk"] [ext_resource type="AudioStream" uid="uid://ck86vhmbg3xnj" path="res://assets/sfx/footsteps/plastic/plastic5.wav" id="30_p6grl"] [ext_resource type="Script" uid="uid://c5o1d2shq2qig" path="res://src/world/game_sound/game_sound_emitter.gd" id="31_wcxbk"] +[ext_resource type="Script" uid="uid://b5loa2u6s5l5c" path="res://src/player/rigid_body_physics.gd" id="36_phdu6"] [sub_resource type="Animation" id="Animation_x42xx"] length = 0.001 @@ -796,3 +797,6 @@ libraries = { transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -1, 0) visible = false mesh = SubResource("PlaneMesh_p6grl") + +[node name="RigidBodyPhysics" type="Node" parent="."] +script = ExtResource("36_phdu6") diff --git a/src/player/rigid_body_physics.gd b/src/player/rigid_body_physics.gd new file mode 100644 index 0000000..661b9e4 --- /dev/null +++ b/src/player/rigid_body_physics.gd @@ -0,0 +1,31 @@ +extends Node +## Component to simulate rigid body interactions with a CharacterBody3D. + +## Base collision force (will scale with impact velocity) +@export_range(0.0, 500.0, 0.1) var force := 50.0 + +## Lower bound for collision speed scaling. +@export var min_speed := 1.0 + +## Upper bound for collision speed scaling. +@export var max_speed := 10.0 + +## Toggle rigid body interactions. +@export var enabled := true + +@onready var controller := owner as CharacterBody3D + + +func _physics_process(_delta: float) -> void: + if not enabled: + return + + for i: int in controller.get_slide_collision_count(): + var collision := controller.get_slide_collision(i) + for j: int in collision.get_collision_count(): + var collider := collision.get_collider(j) as RigidBody3D + if collider: + var direction := -collision.get_normal() + var speed := clampf(controller.velocity.length(), min_speed, max_speed) + var offset := collision.get_position(j) - collider.global_position + collider.apply_impulse(direction * speed * force, offset) diff --git a/src/player/rigid_body_physics.gd.uid b/src/player/rigid_body_physics.gd.uid new file mode 100644 index 0000000..3978a4e --- /dev/null +++ b/src/player/rigid_body_physics.gd.uid @@ -0,0 +1 @@ +uid://b5loa2u6s5l5c