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
|
Jump: Space
|
||||||
Crouch: Right Control
|
Crouch: Right Control
|
||||||
Run: Right Shift
|
Run: Right Shift
|
||||||
Toggle Flashlight: E
|
Pick Up Object: E
|
||||||
|
Toggle Flashlight: F
|
||||||
Open Curtains: C
|
Open Curtains: C
|
||||||
Debug Info: F3
|
Debug Info: F3
|
||||||
Open Menu: ESC
|
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 grav_vel: Vector3 # Gravity velocity
|
||||||
var jump_vel: Vector3 # Jumping 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
|
@onready var camera: Camera3D = $Camera
|
||||||
|
|
||||||
func _ready() -> void:
|
func _ready() -> void:
|
||||||
|
|
@ -102,6 +113,7 @@ func _unhandled_input(event: InputEvent) -> void:
|
||||||
camera_sens = 3
|
camera_sens = 3
|
||||||
|
|
||||||
func _physics_process(delta: float) -> void:
|
func _physics_process(delta: float) -> void:
|
||||||
|
handle_holding_objects()
|
||||||
if (interact):
|
if (interact):
|
||||||
if Input.is_action_just_pressed(&"freeroam_jump"): jumping = true
|
if Input.is_action_just_pressed(&"freeroam_jump"): jumping = true
|
||||||
elif Input.is_action_just_pressed(&"freeroam_crouch"):
|
elif Input.is_action_just_pressed(&"freeroam_crouch"):
|
||||||
|
|
@ -189,3 +201,37 @@ func _jump(delta: float) -> Vector3:
|
||||||
return jump_vel
|
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)
|
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
|
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="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"]
|
[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://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://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="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"]
|
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_ejydr"]
|
||||||
radius = 0.3
|
radius = 0.3
|
||||||
|
|
@ -34,6 +35,10 @@ spot_range = 1000.0
|
||||||
spot_angle = 30.0
|
spot_angle = 30.0
|
||||||
spot_angle_attenuation = 0.25
|
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")]
|
[node name="DebugMenu" parent="." instance=ExtResource("3_ejydr")]
|
||||||
visible = false
|
visible = false
|
||||||
mouse_filter = 2
|
mouse_filter = 2
|
||||||
|
|
@ -55,3 +60,8 @@ volume_db = -5.0
|
||||||
[node name="FlashlightOffSFX" type="AudioStreamPlayer" parent="."]
|
[node name="FlashlightOffSFX" type="AudioStreamPlayer" parent="."]
|
||||||
stream = ExtResource("7_7v0xc")
|
stream = ExtResource("7_7v0xc")
|
||||||
volume_db = -5.0
|
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={
|
freeroam_toggle_flashlight={
|
||||||
"deadzone": 0.2,
|
"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)
|
"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":3,"pressure":0.0,"pressed":true,"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={
|
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)
|
"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]
|
[physics]
|
||||||
|
|
||||||
3d/physics_engine="Jolt Physics"
|
3d/physics_engine="Jolt Physics"
|
||||||
|
common/physics_interpolation=true
|
||||||
|
|
||||||
[rendering]
|
[rendering]
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue