Godot 4.6 exploration game with player movement, step-rotation camera rig, and POI interaction system (explore/rest/close menu). main.tscn is a test scene with placeholder props; debug/ holds unwired terrain prototypes (voxel river, procedural island mesh, cross-shaped hub
63 lines
1.5 KiB
GDScript
Executable File
63 lines
1.5 KiB
GDScript
Executable File
extends CharacterBody3D
|
|
|
|
@export var move_speed: float = 5.0
|
|
@export var gravity: float = 9.8
|
|
|
|
var camera_rig: Node3D
|
|
|
|
@onready var sprite: AnimatedSprite3D = $AnimatedSprite3D
|
|
|
|
func _ready() -> void:
|
|
camera_rig = get_tree().get_first_node_in_group("camera_rig")
|
|
if camera_rig == null:
|
|
push_error("CameraRig nicht gefunden! Gruppe 'camera_rig' gesetzt?")
|
|
|
|
func _physics_process(delta: float) -> void:
|
|
# Bewegung sperren während Interaction
|
|
if InteractionManager.active:
|
|
velocity = Vector3.ZERO
|
|
return
|
|
# Schwerkraft
|
|
if not is_on_floor():
|
|
velocity.y -= gravity * delta
|
|
|
|
# Eingabe
|
|
var input_dir = Vector2(
|
|
Input.get_axis("move_left", "move_right"),
|
|
Input.get_axis("move_forward", "move_backward")
|
|
)
|
|
|
|
if input_dir != Vector2.ZERO:
|
|
var cam_basis = camera_rig.global_transform.basis
|
|
var forward = -cam_basis.z
|
|
var right = cam_basis.x
|
|
forward.y = 0
|
|
right.y = 0
|
|
forward = forward.normalized()
|
|
right = right.normalized()
|
|
|
|
var move_dir = (forward * -input_dir.y + right * input_dir.x).normalized()
|
|
velocity.x = move_dir.x * move_speed
|
|
velocity.z = move_dir.z * move_speed
|
|
|
|
_update_animation(input_dir)
|
|
else:
|
|
velocity.x = move_toward(velocity.x, 0, move_speed)
|
|
velocity.z = move_toward(velocity.z, 0, move_speed)
|
|
sprite.play("idle")
|
|
|
|
move_and_slide()
|
|
|
|
func _update_animation(input_dir: Vector2) -> void:
|
|
|
|
if input_dir.y > 0.1:
|
|
sprite.play("move_down")
|
|
elif input_dir.y < -0.1:
|
|
sprite.play("move_up")
|
|
elif input_dir.x > 0.1:
|
|
sprite.play("move_right")
|
|
elif input_dir.x < -0.1:
|
|
sprite.play("move_left")
|
|
else:
|
|
sprite.play("idle")
|