Last active
July 12, 2024 09:22
-
-
Save bramreth/2a62faf5605ab602447eb5cc17374693 to your computer and use it in GitHub Desktop.
The code for a first person movement youtube tutorial in Godot 4
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
extends CharacterBody3D | |
const SPEED = 5.0 | |
const JUMP_VELOCITY = 4.5 | |
# Get the gravity from the project settings to be synced with RigidDynamicBody nodes. | |
var gravity: float = ProjectSettings.get_setting("physics/3d/default_gravity") | |
@onready var neck := $Neck | |
@onready var camera := $Neck/Camera3d | |
func _unhandled_input(event: InputEvent) -> void: | |
if event is InputEventMouseButton: | |
Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED) | |
elif event.is_action_pressed("ui_cancel"): | |
Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE) | |
if Input.get_mouse_mode() == Input.MOUSE_MODE_CAPTURED: | |
if event is InputEventMouseMotion: | |
neck.rotate_y(-event.relative.x * 0.01) | |
camera.rotate_x(-event.relative.y * 0.01) | |
camera.rotation.x = clamp(camera.rotation.x, deg_to_rad(-30), deg_to_rad(60)) | |
func _physics_process(delta: float) -> void: | |
# Add the gravity. | |
if not is_on_floor(): | |
velocity.y -= gravity * delta | |
# Handle Jump. | |
if Input.is_action_just_pressed("ui_accept") and is_on_floor(): | |
velocity.y = JUMP_VELOCITY | |
# Get the input direction and handle the movement/deceleration. | |
# As good practice, you should replace UI actions with custom gameplay actions. | |
var input_dir := Input.get_vector("left", "right", "forward", "back") | |
var direction = (neck.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() |
I get an error at camera.rotate_x(-event.relative.y * 0.01) in Line 20
same for me too any one have an Idea how to fix?
For anyone having an issue with "trying to call a null instance inside a null instance"
change Neck/Camera3d to Neck/Camera3D
niiiiiiiiiiiiiiiiice
var direction = (neck.transform.basis * Vector3(input_dir.x, 0, input_dir.y)).normalized()
some error about the neck?
the fix for this problem is dropping Transform. like this
var direction = (neck.basis * Vector3(input_dir.x, 0, input_dir.y)).normalized()
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
for these: func _unhandled_input(event: InputEvent) -> void:, func _physics_process(delta: float) -> void: you might want to change them to this: func _unhandled_input(event: InputEvent):, func _physics_process(delta: float):
I had errors with the camera that caused it to crash and this seemed to be the solution