generated from krampus/template-godot4
Player has rigid-body collisions
This commit is contained in:
parent
26e66b3a06
commit
468c5b0d7c
@ -122,9 +122,9 @@ shape = SubResource("WorldBoundaryShape3D_6j7vt")
|
|||||||
|
|
||||||
[node name="MedBox" type="RigidBody3D" parent="."]
|
[node name="MedBox" type="RigidBody3D" parent="."]
|
||||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 6, 1.2, -6)
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 6, 1.2, -6)
|
||||||
collision_layer = 6
|
collision_layer = 7
|
||||||
collision_mask = 9
|
collision_mask = 9
|
||||||
mass = 10.0
|
mass = 50.0
|
||||||
|
|
||||||
[node name="MeshInstance3D" type="MeshInstance3D" parent="MedBox"]
|
[node name="MeshInstance3D" type="MeshInstance3D" parent="MedBox"]
|
||||||
mesh = SubResource("BoxMesh_252gx")
|
mesh = SubResource("BoxMesh_252gx")
|
||||||
@ -139,9 +139,9 @@ metadata/_custom_type_script = "uid://040xta01xqxd"
|
|||||||
|
|
||||||
[node name="BigBox" type="RigidBody3D" parent="."]
|
[node name="BigBox" type="RigidBody3D" parent="."]
|
||||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 10.5, 1.8, -6)
|
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
|
collision_mask = 9
|
||||||
mass = 50.0
|
mass = 500.0
|
||||||
|
|
||||||
[node name="MeshInstance3D" type="MeshInstance3D" parent="BigBox"]
|
[node name="MeshInstance3D" type="MeshInstance3D" parent="BigBox"]
|
||||||
mesh = SubResource("BoxMesh_35l2h")
|
mesh = SubResource("BoxMesh_35l2h")
|
||||||
|
@ -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://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"]
|
[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://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="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://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"]
|
[sub_resource type="Animation" id="Animation_x42xx"]
|
||||||
length = 0.001
|
length = 0.001
|
||||||
@ -796,3 +797,6 @@ libraries = {
|
|||||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -1, 0)
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -1, 0)
|
||||||
visible = false
|
visible = false
|
||||||
mesh = SubResource("PlaneMesh_p6grl")
|
mesh = SubResource("PlaneMesh_p6grl")
|
||||||
|
|
||||||
|
[node name="RigidBodyPhysics" type="Node" parent="."]
|
||||||
|
script = ExtResource("36_phdu6")
|
||||||
|
31
src/player/rigid_body_physics.gd
Normal file
31
src/player/rigid_body_physics.gd
Normal file
@ -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)
|
1
src/player/rigid_body_physics.gd.uid
Normal file
1
src/player/rigid_body_physics.gd.uid
Normal file
@ -0,0 +1 @@
|
|||||||
|
uid://b5loa2u6s5l5c
|
Loading…
x
Reference in New Issue
Block a user