implement physics props
This commit is contained in:
parent
1be53bf7bb
commit
6e783e0e57
9 changed files with 159 additions and 4 deletions
|
|
@ -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()
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue