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

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