feat: setup initial repo and smallest working scene

This commit is contained in:
Rijad Zuzo
2026-06-17 19:39:38 +02:00
commit 20027bed4b
11 changed files with 309 additions and 0 deletions
+74
View File
@@ -0,0 +1,74 @@
[gd_scene load_steps=9 format=3 uid="uid://rs3hv73svbpa"]
[ext_resource type="Script" uid="uid://4mg67crlim53" path="res://scenes/player/player.gd" id="1_o5qli"]
[ext_resource type="Script" uid="uid://ii8ai801jur2" path="res://scenes/player/camera_rig.gd" id="2_0wfyh"]
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_o5qli"]
albedo_color = Color(0.16862746, 0.52156866, 0.30588236, 1)
[sub_resource type="BoxMesh" id="BoxMesh_sgp6g"]
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_o5qli"]
radius = 0.4
height = 1.7
[sub_resource type="CapsuleMesh" id="CapsuleMesh_sgp6g"]
[sub_resource type="BoxMesh" id="BoxMesh_0wfyh"]
[sub_resource type="Environment" id="Environment_o5qli"]
background_mode = 1
background_color = Color(0.46428233, 0.7990817, 0.98692364, 1)
ambient_light_source = 2
ambient_light_color = Color(1, 1, 1, 1)
ambient_light_energy = 0.5
[node name="Main" type="Node3D"]
[node name="DirectionalLight3D" type="DirectionalLight3D" parent="."]
transform = Transform3D(0.8660254, -0.43301272, 0.24999999, 0, 0.49999997, 0.86602545, -0.5, -0.75, 0.43301266, 0, 0, 0)
light_energy = 2.0
[node name="World" type="Node3D" parent="."]
[node name="Ground" type="MeshInstance3D" parent="World"]
transform = Transform3D(30, 0, 0, 0, 0.1, 0, 0, 0, 30, 0, -0.05, 0)
material_override = SubResource("StandardMaterial3D_o5qli")
mesh = SubResource("BoxMesh_sgp6g")
[node name="Player" type="CharacterBody3D" parent="." node_paths=PackedStringArray("camera_rig")]
script = ExtResource("1_o5qli")
camera_rig = NodePath("../CameraRig")
[node name="CollisionShape3D" type="CollisionShape3D" parent="Player"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.85, 0)
shape = SubResource("CapsuleShape3D_o5qli")
[node name="MeshInstance3D" type="MeshInstance3D" parent="Player"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.85, 0)
mesh = SubResource("CapsuleMesh_sgp6g")
[node name="FaceMarker" type="MeshInstance3D" parent="Player"]
transform = Transform3D(0.15, 0, 0, 0, 0.15, 0, 0, 0, 0.4, 0, 1.2, 0.6266626)
mesh = SubResource("BoxMesh_0wfyh")
[node name="CameraRig" type="Node3D" parent="." node_paths=PackedStringArray("target")]
transform = Transform3D(1, 0, 0, 0, 0.57357645, 0.81915206, 0, -0.81915206, 0.57357645, 0, 10, 8)
script = ExtResource("2_0wfyh")
target = NodePath("../Player")
follow_speed = 8.0
deadzone_right = 2.0
deadzone_forward = 2.0
[node name="Camera3D" type="Camera3D" parent="CameraRig"]
current = true
fov = 65.0
[node name="SimulationManager" type="Node" parent="."]
[node name="WorldViewManager" type="Node" parent="."]
[node name="EventBus" type="Node" parent="."]
[node name="WorldEnvironment" type="WorldEnvironment" parent="."]
environment = SubResource("Environment_o5qli")
+58
View File
@@ -0,0 +1,58 @@
extends Node3D
@export var target: Node3D
@export var follow_offset := Vector3(0, 10, 8)
@export var follow_speed := 12.0
@export var mouse_sensitivity := 0.002
@export var deadzone_right := 3.0
@export var deadzone_forward := 3.0
var yaw := 0.0
var focus_position := Vector3.ZERO
func _ready() -> void:
Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)
if target:
focus_position = target.global_position
global_position = focus_position + follow_offset
func _unhandled_input(event: InputEvent) -> void:
if event is InputEventMouseMotion:
yaw -= event.relative.x * mouse_sensitivity
if event.is_action_pressed("ui_cancel"):
Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE)
func _process(delta: float) -> void:
if target == null:
return
rotation = Vector3(deg_to_rad(-55), yaw, 0)
var target_pos := target.global_position
var diff := target_pos - focus_position
# Camera-relative horizontal axes
var cam_right := Vector3.RIGHT.rotated(Vector3.UP, yaw).normalized()
var cam_forward := Vector3.FORWARD.rotated(Vector3.UP, yaw).normalized()
var diff_right := diff.dot(cam_right)
var diff_forward := diff.dot(cam_forward)
if abs(diff_right) > deadzone_right:
focus_position += cam_right * (diff_right - sign(diff_right) * deadzone_right)
if abs(diff_forward) > deadzone_forward:
focus_position += cam_forward * (diff_forward - sign(diff_forward) * deadzone_forward)
var rotated_offset := follow_offset.rotated(Vector3.UP, yaw)
var desired_position := focus_position + rotated_offset
global_position = global_position.lerp(
desired_position,
1.0 - exp(-follow_speed * delta)
)
+1
View File
@@ -0,0 +1 @@
uid://ii8ai801jur2
+37
View File
@@ -0,0 +1,37 @@
extends CharacterBody3D
@export var move_speed := 7.0
@export var acceleration := 18.0
@export var rotation_speed := 12.0
@export var camera_rig: Node3D
func _physics_process(delta: float) -> void:
var input := Input.get_vector(
"move_left",
"move_right",
"move_forward",
"move_backward"
)
var forward := -camera_rig.global_transform.basis.z
var right := camera_rig.global_transform.basis.x
forward.y = 0
right.y = 0
forward = forward.normalized()
right = right.normalized()
var direction := (right * input.x + forward * -input.y).normalized()
var target_velocity := direction * move_speed
velocity.x = move_toward(velocity.x, target_velocity.x, acceleration * delta)
velocity.z = move_toward(velocity.z, target_velocity.z, acceleration * delta)
velocity.y = 0.0
move_and_slide()
if direction.length() > 0.01:
var target_angle := atan2(direction.x, direction.z)
rotation.y = lerp_angle(rotation.y, target_angle, rotation_speed * delta)
+1
View File
@@ -0,0 +1 @@
uid://4mg67crlim53