Added raycast

Added making object interactable
Added slider + knob
This commit is contained in:
2024-07-07 16:19:12 +02:00
parent 0ee0eb63c0
commit ea4f06feed
8 changed files with 260 additions and 0 deletions

View File

@@ -11,6 +11,7 @@ config_version=5
[application]
config/name="BaseDefendPrototype"
run/main_scene="res://scenes/main.tscn"
config/features=PackedStringArray("4.2", "Forward Plus")
config/icon="res://icon.svg"
@@ -22,3 +23,36 @@ gdscript/warnings/untyped_declaration=2
version_control/plugin_name="GitPlugin"
version_control/autoload_on_startup=true
[input]
scroll_up={
"deadzone": 0.5,
"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":0,"position":Vector2(0, 0),"global_position":Vector2(0, 0),"factor":1.0,"button_index":4,"canceled":false,"pressed":false,"double_click":false,"script":null)
]
}
scroll_down={
"deadzone": 0.5,
"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":0,"position":Vector2(0, 0),"global_position":Vector2(0, 0),"factor":1.0,"button_index":5,"canceled":false,"pressed":false,"double_click":false,"script":null)
]
}
left={
"deadzone": 0.5,
"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":65,"key_label":0,"unicode":97,"echo":false,"script":null)
]
}
right={
"deadzone": 0.5,
"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":68,"key_label":0,"unicode":100,"echo":false,"script":null)
]
}
forward={
"deadzone": 0.5,
"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":87,"key_label":0,"unicode":119,"echo":false,"script":null)
]
}
back={
"deadzone": 0.5,
"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":83,"key_label":0,"unicode":115,"echo":false,"script":null)
]
}

27
scenes/Camera3D.gd Normal file
View File

@@ -0,0 +1,27 @@
extends Camera3D
@onready var raycast : RayCast3D = $RayCast3D
var last_collided_object : CollisionObject3D = null
func _process(_delta : float) -> void:
check_interaction()
func check_interaction() -> void:
if raycast.is_colliding():
var collider : CollisionObject3D = raycast.get_collider()
if collider != last_collided_object:
if last_collided_object != null:
print("Stopped looking at interactable object:", last_collided_object.name)
if last_collided_object.has_method("make_interactable"):
last_collided_object.make_interactable(false)
print("Started looking at interactable object:", collider.name)
last_collided_object = collider
if collider.has_method("make_interactable"):
collider.make_interactable(true)
else:
if last_collided_object != null:
print("Stopped looking at interactable object:", last_collided_object.name)
if last_collided_object.has_method("make_interactable"):
last_collided_object.make_interactable(false)
last_collided_object = null

64
scenes/control_panel.tscn Normal file
View File

@@ -0,0 +1,64 @@
[gd_scene load_steps=11 format=3 uid="uid://bte0jkgh6vd8x"]
[ext_resource type="Script" path="res://scripts/Slider1.gd" id="1_nyunj"]
[sub_resource type="BoxShape3D" id="BoxShape3D_6i38b"]
size = Vector3(3, 1, 1)
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_4f8ex"]
albedo_color = Color(0.351563, 0.351563, 0.351563, 1)
[sub_resource type="BoxMesh" id="BoxMesh_ymgdf"]
material = SubResource("StandardMaterial3D_4f8ex")
size = Vector3(3, 1, 0.3)
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_em8o8"]
albedo_color = Color(0.351563, 0.351563, 0.351563, 1)
[sub_resource type="BoxMesh" id="BoxMesh_7rk03"]
material = SubResource("StandardMaterial3D_em8o8")
size = Vector3(3, 0.1, 1)
[sub_resource type="BoxShape3D" id="BoxShape3D_gw828"]
size = Vector3(0.1, 0.05, 0.6)
[sub_resource type="BoxMesh" id="BoxMesh_5801d"]
size = Vector3(0.05, 0.05, 0.5)
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_ldgvd"]
albedo_color = Color(0.0438094, 0.444896, 0.673899, 1)
[sub_resource type="CylinderMesh" id="CylinderMesh_s3lht"]
material = SubResource("StandardMaterial3D_ldgvd")
top_radius = 0.02
bottom_radius = 0.02
height = 0.1
[node name="ControlPanel" type="StaticBody3D"]
[node name="CollisionShape3D" type="CollisionShape3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.5, 0.5, 0.5)
shape = SubResource("BoxShape3D_6i38b")
[node name="Structure" type="MeshInstance3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.5, 0.5, 0.5)
mesh = SubResource("BoxMesh_ymgdf")
[node name="MeshInstance3D" type="MeshInstance3D" parent="Structure"]
transform = Transform3D(1, 0, 0, 0, 0.939693, -0.34202, 0, 0.34202, 0.939693, 0, 0.55, 0)
mesh = SubResource("BoxMesh_7rk03")
[node name="Slider1" type="StaticBody3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 0.939693, -0.34202, 0, 0.34202, 0.939693, 0.182479, 1.06904, 0.591278)
script = ExtResource("1_nyunj")
[node name="RaycastCollider" type="CollisionShape3D" parent="Slider1"]
shape = SubResource("BoxShape3D_gw828")
[node name="Slider" type="MeshInstance3D" parent="Slider1"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0)
mesh = SubResource("BoxMesh_5801d")
[node name="Knob" type="MeshInstance3D" parent="Slider1/Slider"]
transform = Transform3D(-4.37115e-08, 1, -4.37115e-08, 0, -4.37114e-08, -1, -1, -4.37114e-08, 1.91069e-15, 0, 0.04, 0.25)
mesh = SubResource("CylinderMesh_s3lht")

4
scenes/main.gd Normal file
View File

@@ -0,0 +1,4 @@
extends Node3D
func _ready() -> void:
Input.mouse_mode = Input.MOUSE_MODE_CAPTURED

32
scenes/main.tscn Normal file
View File

@@ -0,0 +1,32 @@
[gd_scene load_steps=6 format=3 uid="uid://dlekwle45c0y2"]
[ext_resource type="Script" path="res://scenes/main.gd" id="1_12te6"]
[ext_resource type="PackedScene" uid="uid://bte0jkgh6vd8x" path="res://scenes/control_panel.tscn" id="1_j1pw0"]
[ext_resource type="PackedScene" uid="uid://u6bx2c081h3n" path="res://scenes/player.tscn" id="2_04ebg"]
[sub_resource type="BoxShape3D" id="BoxShape3D_3nuje"]
size = Vector3(50, 2, 50)
[sub_resource type="BoxMesh" id="BoxMesh_py2d4"]
size = Vector3(50, 2, 50)
[node name="Main" type="Node3D"]
script = ExtResource("1_12te6")
[node name="ControlPanel" parent="." instance=ExtResource("1_j1pw0")]
[node name="SpotLight3D" type="SpotLight3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 0.568088, 0.822968, 0, -0.822968, 0.568088, 1.3562, 2.47603, 2.06382)
light_energy = 16.0
[node name="Player" parent="." instance=ExtResource("2_04ebg")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.26895, 1.48304, 1.97319)
[node name="Ground" type="StaticBody3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -1, 0)
[node name="CollisionShape3D" type="CollisionShape3D" parent="Ground"]
shape = SubResource("BoxShape3D_3nuje")
[node name="MeshInstance3D" type="MeshInstance3D" parent="Ground/CollisionShape3D"]
mesh = SubResource("BoxMesh_py2d4")

42
scenes/player.tscn Normal file
View File

@@ -0,0 +1,42 @@
[gd_scene load_steps=4 format=3 uid="uid://u6bx2c081h3n"]
[ext_resource type="Script" path="res://scripts/Player.gd" id="1_s6pnw"]
[ext_resource type="Script" path="res://scenes/Camera3D.gd" id="2_vvm4p"]
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_vhrs0"]
radius = 0.2
[node name="Player" type="CharacterBody3D"]
script = ExtResource("1_s6pnw")
[node name="CollisionShape3D" type="CollisionShape3D" parent="."]
shape = SubResource("CapsuleShape3D_vhrs0")
[node name="Camera3D" type="Camera3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.673565, 0)
script = ExtResource("2_vvm4p")
[node name="RayCast3D" type="RayCast3D" parent="Camera3D"]
target_position = Vector3(0, 0, -3)
[node name="PlayerUI" type="Control" parent="."]
layout_mode = 3
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
[node name="ColorRect" type="ColorRect" parent="PlayerUI"]
layout_mode = 1
anchors_preset = 8
anchor_left = 0.5
anchor_top = 0.5
anchor_right = 0.5
anchor_bottom = 0.5
offset_left = -0.5
offset_top = -0.5
offset_right = 1.5
offset_bottom = 1.5
grow_horizontal = 2
grow_vertical = 2

22
scripts/Player.gd Normal file
View File

@@ -0,0 +1,22 @@
extends CharacterBody3D
var gravity : float = ProjectSettings.get_setting("physics/3d/default_gravity")
var speed : float = 5.0
var mouse_sensitivity : float = 0.002
@onready var camera_3d : Camera3D = $Camera3D
func _physics_process(delta : float) -> void:
if not is_on_floor():
velocity.y += -gravity * delta
var input : Vector2 = Input.get_vector("left", "right", "forward", "back")
var movement_dir : Vector3 = transform.basis * Vector3(input.x, 0, input.y)
velocity.x = movement_dir.x * speed
velocity.z = movement_dir.z * speed
move_and_slide()
func _input(event : InputEvent) -> void:
if event is InputEventMouseMotion and Input.mouse_mode == Input.MOUSE_MODE_CAPTURED:
rotate_y(-event.relative.x * mouse_sensitivity)
camera_3d.rotate_x(-event.relative.y * mouse_sensitivity)
camera_3d.rotation.x = clampf(camera_3d.rotation.x, -deg_to_rad(70), deg_to_rad(70))

35
scripts/Slider1.gd Normal file
View File

@@ -0,0 +1,35 @@
extends StaticBody3D
@export var slider_length: float = 0.5
@export var angle_degrees: float = 20.0
@export var scroll_sensitivity: float = 0.025
@onready var knob : MeshInstance3D = $Slider/Knob
var knob_position : float = 0.0
var interacting : bool = false
func _ready() -> void:
print("ready!")
update_knob_position()
func _process(_delta : float) -> void:
if interacting:
if Input.is_action_just_pressed("scroll_up"):
knob_position = clamp(knob_position + scroll_sensitivity, 0.0, 1.0)
update_knob_position()
elif Input.is_action_just_pressed("scroll_down"):
knob_position = clamp(knob_position - scroll_sensitivity, 0.0, 1.0)
update_knob_position()
func update_knob_position() -> void:
var start_position : Vector3 = Vector3(0, 0.04, slider_length / 2)
var end_position : Vector3 = Vector3(0, 0.04, -slider_length / 2)
var knob_world_position : Vector3 = start_position.lerp(end_position, knob_position)
knob.position = knob_world_position
print(knob_position)
print(knob_world_position)
func make_interactable(interactable : bool) -> void:
interacting = interactable