-
-
Save bramreth/2a62faf5605ab602447eb5cc17374693 to your computer and use it in GitHub Desktop.
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() |
Hello in Godot 4 Beta 1, this has changed
deg2rad
is nowdeg_to_rad
.
Thanks for the comment! Just updated the gist 😁
There is a bug - if you rotate the player node in the editor then the direction is not correctly mapped to the new orientation.
I don't know a good way to fix this, so I use this method:
var direction = ((neck as Node3D).transform.basis.rotated(Vector3.UP, rotation.y) * Vector3(input_dir.x, 0, input_dir.y)).normalized()
I get an error at camera.rotate_x(-event.relative.y * 0.01) in Line 20
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
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()
Hello its godot 4.3. can you update this code??
Thanks :3
There is a bug - if you rotate the player node in the editor then the direction is not correctly mapped to the new orientation.
I don't know a good way to fix this, so I use this method:
var direction = ((neck as Node3D).transform.basis.rotated(Vector3.UP, rotation.y) * Vector3(input_dir.x, 0, input_dir.y)).normalized()
thanks so much
Hello in Godot 4 Beta 1, this has changed
deg2rad
is nowdeg_to_rad
.