Pesquisar este blog
player simples com uma camera
extends CharacterBody3D
const SPEED = 5.0
const JUMP_VELOCITY = 4.5
const MOUSE_SENSITIVITY = 0.003
# Referência para a Camera3D (certifique-se de que o nome na árvore da cena seja Camera3D)
@onready var camera_3d: Camera3D = $Camera3D
# Ângulos limites para olhar para cima/baixo em radianos (aprox. -80° a 80°)
const MIN_PITCH = deg_to_rad(-80.0)
const MAX_PITCH = deg_to_rad(80.0)
func _ready() -> void:
Input.mouse_mode = Input.MOUSE_MODE_CAPTURED
func _unhandled_input(event: InputEvent) -> void:
if event is InputEventMouseMotion:
# 1. Rotação Horizontal (Gira o corpo todo do personagem no eixo Y)
rotate_y(-event.relative.x * MOUSE_SENSITIVITY)
# 2. Rotação Vertical (Gira APENAS a câmera no eixo X)
camera_3d.rotate_x(-event.relative.y * MOUSE_SENSITIVITY)
# Trava a rotação da câmera para não inverter/capotar
camera_3d.rotation.x = clamp(camera_3d.rotation.x, MIN_PITCH, MAX_PITCH)
if event.is_action_pressed("ui_cancel"):
Input.mouse_mode = Input.MOUSE_MODE_VISIBLE
func _physics_process(delta: float) -> void:
if not is_on_floor():
velocity += get_gravity() * delta
if Input.is_action_just_pressed("ui_accept") and is_on_floor():
velocity.y = JUMP_VELOCITY
var input_dir := Input.get_vector("ui_left", "ui_right", "ui_up", "ui_down")
var direction := (transform.basis * Vector3(input_dir.x, 0, input_dir.y)).normalized()
if direction:
velocity.x = direction.x * SPEED
velocity.z = direction.z * SPEED
else:
velocity.x = move_toward(velocity.x, 0, SPEED)
velocity.z = move_toward(velocity.z, 0, SPEED)
move_and_slide()