Invaild get index 'Head' (on base: 'NIL')

Godot Version

`Godot4

Question

Can you guys pls help im over here helping people now i forgot how to solve something as simple as this, i can’t find it in my notes either so yeah:

class_name Player

extends CharacterBody3D

#Movement Controls
var speed
const WALK_SPEED = 5.0
const SPRINT_SPEED = 8.0
const JUMP_VELOCITY = 4.5
const SENSITIVITY = 0.005

#Headbobbing Controls
const BOB_FREQ = 2.0
const BOB_AMP = 0.08
var t_bob = 0.0

#FOV Controls
const BASE_FOV = 75.0
const FOV_CHANGE = 1.5

#Interaction Controls
@export var interact_distance : float = 2
var interact_cast_result

Get the gravity from the project settings to be synced with RigidBody nodes.

var gravity = 9.8

@onready var Head = $Head
@onready var Camera = $Head/Camera3D

func _ready():
Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)

#Camera
func _unhandled_input(event):
if event is InputEventMouseMotion:
Head.rotate_y(-event.relative.x * SENSITIVITY)
Camera.rotate_x(-event.relative.y * SENSITIVITY)
Camera.rotation.x = clamp(Camera.rotation.x, deg_to_rad(-40), deg_to_rad(60))

func _physics_process(delta):

interact_cast()

# Add the gravity.
if not is_on_floor():
	velocity.y -= gravity * delta

# Handle Jump.
if Input.is_action_just_pressed("Jump") and is_on_floor():
	velocity.y = JUMP_VELOCITY

if Input.is_action_pressed("Sprint") and is_on_floor():
	speed = SPRINT_SPEED
else:
	speed = WALK_SPEED



# 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("Move_Left", "Move_Right", "Move_Forward", "Move_Backward")
var direction = (Head.transform.basis * Vector3(input_dir.x, 0, input_dir.y)).normalized()
if is_on_floor():
	if direction:
		velocity.x = direction.x * speed
		velocity.z = direction.z * speed
	else:
		velocity.x = lerp(velocity.x, direction.x * speed, delta * 7.0)
		velocity.z = lerp(velocity.z, direction.z * speed, delta * 7.0)
else:
	velocity.x = lerp(velocity.x, direction.x * speed, delta * 3.0)
	velocity.z = lerp(velocity.z, direction.z * speed, delta * 3.0)

t_bob += delta * velocity.length() * float(is_on_floor())
Camera.transform.origin = _HeadBob(t_bob)

var velocity_clamped = clamp(velocity.length(), 0.5, SPRINT_SPEED * 2)
var target_fov = BASE_FOV + FOV_CHANGE * velocity_clamped
Camera.fov = lerp(Camera.fov, target_fov, delta * 8.0)

func _process(_delta):
move_and_slide()

#Headbob
func _HeadBob(time) → Vector3:
var pos = Vector3.ZERO
pos.y = sin(time * BOB_FREQ) * BOB_AMP
pos.x = cos(time * BOB_FREQ / 2) * BOB_AMP
return pos

func interact_cast() → void:
var camera = Global.Player.Head
var space_state = camera.get_World().direct_space_state
var screen_center = get_viewport().size / 2
var origin = camera.project_ray_origin(screen_center)
var end = origin + camera.project_ray_normal(screen_center) * interact_distance
var query = PhysicsRayQueryParameters3D.create(origin, end)
query.collide_with_bodies = true
var result = space_state.intersect_ray(query)
var current_cast_result = result.get(“collider”)
print(current_cast_result)

func interact() → void:
pass

pls help if anyone can

This is the same script from before, just use Camera this script has that variable, you do not need Global.Player.Head

func interact_cast() -> void:
    var camera = Camera # not Global.Player.Head

To get help faster and easier it would be helpful to also describe: what did you try? How is Global defined? And make sure to paste scripts with proper formatting

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.