implement physics props

This commit is contained in:
KawaiiZenbo 2025-10-25 14:32:46 -07:00
parent 1be53bf7bb
commit 6e783e0e57
9 changed files with 159 additions and 4 deletions

Binary file not shown.

View file

@ -0,0 +1,42 @@
[remap]
importer="scene"
importer_version=1
type="PackedScene"
uid="uid://denf02jj7iwwf"
path="res://.godot/imported/ShowroomChair.glb-6d16deb7dd516b5ca70bd68f3f731803.scn"
[deps]
source_file="res://Models/Furniture/ShowroomChair.glb"
dest_files=["res://.godot/imported/ShowroomChair.glb-6d16deb7dd516b5ca70bd68f3f731803.scn"]
[params]
nodes/root_type=""
nodes/root_name=""
nodes/root_script=null
nodes/apply_root_scale=true
nodes/root_scale=1.0
nodes/import_as_skeleton_bones=false
nodes/use_name_suffixes=true
nodes/use_node_type_suffixes=true
meshes/ensure_tangents=true
meshes/generate_lods=true
meshes/create_shadow_meshes=true
meshes/light_baking=1
meshes/lightmap_texel_size=0.2
meshes/force_disable_compression=false
skins/use_named_skins=true
animation/import=true
animation/fps=30
animation/trimming=false
animation/remove_immutable_tracks=true
animation/import_rest_as_RESET=false
import_script/path=""
materials/extract=0
materials/extract_format=0
materials/extract_path=""
_subresources={}
gltf/naming_version=2
gltf/embedded_image_handling=1

View file

@ -575,7 +575,8 @@ Move: W, A, S, D
Jump: Space
Crouch: Right Control
Run: Right Shift
Toggle Flashlight: E
Pick Up Object: E
Toggle Flashlight: F
Open Curtains: C
Debug Info: F3
Open Menu: ESC

View file

@ -0,0 +1,28 @@
[gd_scene load_steps=5 format=3 uid="uid://db8vuekpyg0fl"]
[ext_resource type="PackedScene" uid="uid://denf02jj7iwwf" path="res://Models/Furniture/ShowroomChair.glb" id="1_hq6j1"]
[sub_resource type="PhysicsMaterial" id="PhysicsMaterial_lbe82"]
[sub_resource type="BoxShape3D" id="BoxShape3D_lbe82"]
size = Vector3(0.55, 0.6, 0.55)
[sub_resource type="BoxShape3D" id="BoxShape3D_domyf"]
size = Vector3(0.05, 0.6, 0.55)
[node name="ShowroomChair" type="Node3D"]
[node name="RigidBody3D" type="RigidBody3D" parent="."]
mass = 5.0
physics_material_override = SubResource("PhysicsMaterial_lbe82")
[node name="Model" parent="RigidBody3D" instance=ExtResource("1_hq6j1")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.5, 0)
[node name="CollisionShape3D5" type="CollisionShape3D" parent="RigidBody3D"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.2, 0)
shape = SubResource("BoxShape3D_lbe82")
[node name="CollisionShape3D6" type="CollisionShape3D" parent="RigidBody3D"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.3, 0.4, 0)
shape = SubResource("BoxShape3D_domyf")

View file

@ -36,6 +36,17 @@ var walk_vel: Vector3 # Walking velocity
var grav_vel: Vector3 # Gravity velocity
var jump_vel: Vector3 # Jumping velocity
var throwForce = 2
var followSpeed = 25.0
var followDistance = 1.5
var maxDistanceFromCamera = 5.0
var heldObject: RigidBody3D
var hrx: float = 0
var hry: float = 0
var hrz: float = 0
@onready var interactRay = $Camera/Interact
@onready var camera: Camera3D = $Camera
func _ready() -> void:
@ -102,6 +113,7 @@ func _unhandled_input(event: InputEvent) -> void:
camera_sens = 3
func _physics_process(delta: float) -> void:
handle_holding_objects()
if (interact):
if Input.is_action_just_pressed(&"freeroam_jump"): jumping = true
elif Input.is_action_just_pressed(&"freeroam_crouch"):
@ -189,3 +201,37 @@ func _jump(delta: float) -> Vector3:
return jump_vel
jump_vel = Vector3.ZERO if is_on_floor() or is_on_ceiling_only() else jump_vel.move_toward(Vector3.ZERO, gravity * delta)
return jump_vel
func set_held_object(body):
if body is RigidBody3D:
heldObject = body
hrx = heldObject.rotation.x
hry = heldObject.rotation.y
hrz = heldObject.rotation.z
func drop_held_object():
heldObject = null
func throw_held_object():
var obj = heldObject
drop_held_object()
obj.apply_central_impulse(-camera.global_basis.z * throwForce * 10)
func handle_holding_objects():
if Input.is_action_just_pressed("freeroam_throw_prop"):
if heldObject != null: throw_held_object()
if Input.is_action_just_pressed("freeroam_pickup_prop"):
if heldObject != null: drop_held_object()
elif interactRay.is_colliding(): set_held_object(interactRay.get_collider())
if heldObject != null:
var targetPos = camera.global_transform.origin + (camera.global_basis * Vector3(0, 0, -followDistance)) # 2.5 units in front of camera
var objectPos = heldObject.global_transform.origin
heldObject.linear_velocity = (targetPos - objectPos) * followSpeed
heldObject.rotation.x = hrx
heldObject.rotation.y = hry
heldObject.rotation.z = hrz
if heldObject.global_position.distance_to(camera.global_position) > maxDistanceFromCamera:
drop_held_object()

View file

@ -1,4 +1,4 @@
[gd_scene load_steps=9 format=3 uid="uid://cdk6hwb4hi2wc"]
[gd_scene load_steps=10 format=3 uid="uid://cdk6hwb4hi2wc"]
[ext_resource type="Script" uid="uid://b0c02p6ckmpdq" path="res://Scripts/Player/Player.gd" id="1_2f8j2"]
[ext_resource type="PackedScene" uid="uid://cd67bfok34xhy" path="res://Scenes/GUI/InGameMenu.tscn" id="2_0s4r2"]
@ -7,6 +7,7 @@
[ext_resource type="AudioStream" uid="uid://bfeslo2ldb40t" path="res://UI/Sounds/flashlight_size_change.wav" id="5_gfoho"]
[ext_resource type="AudioStream" uid="uid://8uh608yamqpj" path="res://UI/Sounds/flashlight_on.wav" id="6_gfoho"]
[ext_resource type="AudioStream" uid="uid://bwwl6h7uyog64" path="res://UI/Sounds/flashlight_off.wav" id="7_7v0xc"]
[ext_resource type="Script" uid="uid://b1f0pnt5r8fbx" path="res://Scripts/Player/PropPusher.gd" id="8_7v0xc"]
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_ejydr"]
radius = 0.3
@ -34,6 +35,10 @@ spot_range = 1000.0
spot_angle = 30.0
spot_angle_attenuation = 0.25
[node name="Interact" type="RayCast3D" parent="Camera"]
target_position = Vector3(0, 0, -2.5)
hit_back_faces = false
[node name="DebugMenu" parent="." instance=ExtResource("3_ejydr")]
visible = false
mouse_filter = 2
@ -55,3 +60,8 @@ volume_db = -5.0
[node name="FlashlightOffSFX" type="AudioStreamPlayer" parent="."]
stream = ExtResource("7_7v0xc")
volume_db = -5.0
[node name="PropPusher" type="Node" parent="." node_paths=PackedStringArray("controller")]
script = ExtResource("8_7v0xc")
controller = NodePath("..")
enabled = true

View file

@ -0,0 +1,14 @@
extends Node
@export var controller : CharacterBody3D
@export_range(0.0, 500.0, 0.1) var force : float = 1
@export var enabled : bool = false
func _physics_process(_delta: float) -> void:
if enabled and controller.get_slide_collision_count() > 0:
var collision = controller.get_last_slide_collision()
if collision.get_collider() is RigidBody3D:
var direction = -collision.get_normal()
var speed = clamp(controller.velocity.length(), 1.0, 10.0)
var impulse_position = collision.get_position() - collision.get_collider().global_position
collision.get_collider().apply_impulse(direction * speed * force, impulse_position)

View file

@ -0,0 +1 @@
uid://b1f0pnt5r8fbx

View file

@ -499,8 +499,8 @@ freeroam_run={
}
freeroam_toggle_flashlight={
"deadzone": 0.2,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":69,"key_label":0,"unicode":101,"location":0,"echo":false,"script":null)
, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":3,"pressure":0.0,"pressed":true,"script":null)
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":70,"key_label":0,"unicode":102,"location":0,"echo":false,"script":null)
, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":8,"pressure":0.0,"pressed":false,"script":null)
]
}
freeroam_transport_play_pause={
@ -560,10 +560,23 @@ freeroam_flashlight_zoom_reset={
"events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":true,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":0,"position":Vector2(0, 0),"global_position":Vector2(0, 0),"factor":1.0,"button_index":3,"canceled":false,"pressed":false,"double_click":false,"script":null)
]
}
freeroam_pickup_prop={
"deadzone": 0.2,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":69,"key_label":0,"unicode":101,"location":0,"echo":false,"script":null)
, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":3,"pressure":0.0,"pressed":false,"script":null)
]
}
freeroam_throw_prop={
"deadzone": 0.2,
"events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":1,"position":Vector2(258, 19),"global_position":Vector2(267, 67),"factor":1.0,"button_index":1,"canceled":false,"pressed":true,"double_click":false,"script":null)
, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":5,"axis_value":1.0,"script":null)
]
}
[physics]
3d/physics_engine="Jolt Physics"
common/physics_interpolation=true
[rendering]