Godot Version
Godot Version 4.2.1
Question
Messing around with 3d player movement and the SpringArm with a Camera as a newbie. All of the code seems right to me but, it crashes the moment I try and play the project.
Code for player
extends CharacterBody3D
@export var speed := 7.0
@export var running_speed := 15.0
@export var gravity := -20.0
@export var jump_power := 15.0
@export var h_accel := 35.0
@export var v_accel := 35.0
@export var max_jumps := 2
@export var jump_delay := 0.2
@export var water_multiplier := 0.5
@export var timer = Timer.new()
var movement_vector := Vector3.ZERO
var jump_amount := max_jumps
var jump_timer := Timer.new()
var in_water := false
var _velocity := Vector3.ZERO
@onready var _spring_arm: SpringArm3D = $SpringArm3D
@onready var _model: MeshInstance3D = $MeshInstance3D
func _physics_process(delta: float) -> void:
var move_direction := Vector3.ZERO
var modifier := 1.0
move_direction.x = Input.get_axis("down", "up")
move_direction.z = Input.get_axis("left", "right")
move_direction = move_direction.limit_length(1.0)
move_direction *= running_speed if Input.is_action_pressed("run") else speed
move_direction.y = movement_vector.y
movement_vector = movement_vector.move_toward(move_direction, h_accel * delta)
move_direction = move_direction.rotated(Vector3.UP, _spring_arm.rotation.y).normalized()
_velocity.x = move_direction.x * speed
_velocity.z = move_direction.z * speed
_velocity.y -= gravity * delta
if _velocity.length() > 0.2:
var look_direction = Vector2(_velocity.z, _velocity.x,)
_model.rotation.y = look_direction.angle()
# Vertical movement
movement_vector.y = move_toward(movement_vector.y, gravity, v_accel * delta)
if is_on_floor():
jump_amount = max_jumps
jump_timer.stop()
elif jump_timer.is_stopped() and jump_amount == max_jumps:
jump_timer.start(jump_delay)
if Input.is_action_just_pressed("jump") and jump_amount > 0:
movement_vector.y = jump_power
jump_amount -= 1
jump_timer.stop()
# camerMove
move_and_slide()
movement_vector /= modifier
func _ready():
add_child(jump_timer)
jump_timer.one_shot = true
timer.timeout.connect(_on_Timer_timeout)
func _on_Timer_timeout():
jump_amount -= 1
Code for SpringArm
@onready var _spring_arm: SpringArm3D = $SpringArm3D
@export var mouse_sensitivity := 0.05
func _process(_delta: float) -> void:
_spring_arm.translation = Translation
func _ready() -> void:
set_as_top_level(true)
Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)
func _unhandled_input(event: InputEvent) -> void:
if event is InputEventMouseMotion:
rotation_degrees.x -= event.relative.y * mouse_sensitivity
rotation_degrees.x = clamp(rotation_degrees.x, -90.0, 30.0)
rotation_degrees.y -= event.relative.x * mouse_sensitivity
rotation_degrees.y = wrapf(rotation_degrees.y, 0.0, 360.0)