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()