implement physics props
This commit is contained in:
parent
1be53bf7bb
commit
6e783e0e57
9 changed files with 159 additions and 4 deletions
BIN
Models/Furniture/ShowroomChair.glb
Normal file
BIN
Models/Furniture/ShowroomChair.glb
Normal file
Binary file not shown.
42
Models/Furniture/ShowroomChair.glb.import
Normal file
42
Models/Furniture/ShowroomChair.glb.import
Normal 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
|
||||
|
|
@ -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
|
||||
|
|
|
|||
28
Scenes/Props/Physics/ShowroomChair.tscn
Normal file
28
Scenes/Props/Physics/ShowroomChair.tscn
Normal 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")
|
||||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
14
Scripts/Player/PropPusher.gd
Normal file
14
Scripts/Player/PropPusher.gd
Normal 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)
|
||||
1
Scripts/Player/PropPusher.gd.uid
Normal file
1
Scripts/Player/PropPusher.gd.uid
Normal file
|
|
@ -0,0 +1 @@
|
|||
uid://b1f0pnt5r8fbx
|
||||
|
|
@ -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]
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue