Last active
December 26, 2024 00:40
-
-
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 hidden or 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() |
ok ill try it and ill see
…On Wed, Aug 7, 2024 at 5:42 AM Infinitusvoid ***@***.***> wrote:
***@***.**** commented on this gist.
------------------------------
This seems to be version that works
extends CharacterBody3D
const SPEED = 5.0
const JUMP_VELOCITY = 4.5
# Get the gravity from the project settings to be synced with RigidBody nodes.
var gravity = ProjectSettings.get_setting("physics/3d/default_gravity")
@onready var neck := get_node("Neck")
@onready var camera := get_node("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):
# 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()
—
Reply to this email directly, view it on GitHub
<https://gist.github.com/bramreth/2a62faf5605ab602447eb5cc17374693#gistcomment-5146652>
or unsubscribe
<https://github.com/notifications/unsubscribe-auth/BHZFX5YHGXI3DYG5XITWQADZQIB4BBFKMF2HI4TJMJ2XIZLTSKBKK5TBNR2WLJDUOJ2WLJDOMFWWLO3UNBZGKYLEL5YGC4TUNFRWS4DBNZ2F6YLDORUXM2LUPGBKK5TBNR2WLJDHNFZXJJDOMFWWLK3UNBZGKYLEL52HS4DFVRZXKYTKMVRXIX3UPFYGLK2HNFZXIQ3PNVWWK3TUUZ2G64DJMNZZDAVEOR4XAZNEM5UXG5FFOZQWY5LFVEYTCNRZGU3TEMBVU52HE2LHM5SXFJTDOJSWC5DF>
.
You are receiving this email because you commented on the thread.
Triage notifications on the go with GitHub Mobile for iOS
<https://apps.apple.com/app/apple-store/id1477376905?ct=notification-email&mt=8&pt=524675>
or Android
<https://play.google.com/store/apps/details?id=com.github.android&referrer=utm_campaign%3Dnotification-email%26utm_medium%3Demail%26utm_source%3Dgithub>
.
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
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
this is the same line just a bit diffrent and it works fine for me