Pesquisar este blog

player godot , raycast , pega itens e solta , faz o iten sumir e chama variavel global , camera

extends CharacterBody3D var pegou = 0 const SPEED = 5.0 const JUMP_VELOCITY = 4.5 const MOUSE_SENSITIVITY = 0.003 @onready var camera_3d: Camera3D = $Camera3D @onready var ray_cast_3d: RayCast3D = $Camera3D/RayCast3D @onready var hold_position: Marker3D = $Camera3D/HoldPosition @onready var label: Label = $Label const MIN_PITCH = deg_to_rad(-80.0) const MAX_PITCH = deg_to_rad(80.0) var camera_pitch: float = 0.0 var last_detected_object: Object = null # Lista de objetos que você pode SEGURAR (ficam na mão) var objetos_para_segurar: Array[String] = [ "caixa", "Cadeira", "Livro" ] # Lista de objetos que SUMEM ao pegar (Coletáveis) var objetos_para_coletar: Array[String] = [ "cesta", "Chave", "Maca" ] # Variável para armazenar o objeto que está segurando var held_object: RigidBody3D = null const HOLD_STRENGTH: float = 20.0 # Força de atração do objeto para a mão func _ready() -> void: Input.mouse_mode = Input.MOUSE_MODE_CAPTURED func _unhandled_input(event: InputEvent) -> void: if event is InputEventMouseMotion: rotate_y(-event.relative.x * MOUSE_SENSITIVITY) camera_pitch -= event.relative.y * MOUSE_SENSITIVITY camera_pitch = clamp(camera_pitch, MIN_PITCH, MAX_PITCH) camera_3d.rotation.x = camera_pitch if event.is_action_pressed("ui_cancel"): Input.mouse_mode = Input.MOUSE_MODE_VISIBLE func _physics_process(delta: float) -> void: if not is_on_floor(): velocity += get_gravity() * delta if Input.is_action_just_pressed("ui_accept") and is_on_floor(): velocity.y = JUMP_VELOCITY var input_dir := Input.get_vector("ui_left", "ui_right", "ui_up", "ui_down") var direction := (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 * delta * 10.0) velocity.z = move_toward(velocity.z, 0, SPEED * delta * 10.0) move_and_slide() # Checa a colisão para atualizar o Label _check_raycast_collision() # Ação de Interagir (Pressionar a tecla E) if Input.is_action_just_pressed("interact"): if held_object == null: _interact_with_object() else: _drop_object() # Atualiza a posição do objeto segurado com física _move_held_object(delta) func _check_raycast_collision() -> void: # Se já está segurando um objeto, mantém a mensagem fixa de soltar if held_object != null: return if ray_cast_3d.is_colliding(): var collider = ray_cast_3d.get_collider() # Valida se o objeto colidido ainda existe antes de tentar ler o nome dele if is_instance_valid(collider): if collider.name in objetos_para_segurar or collider.name in objetos_para_coletar: if collider != last_detected_object: last_detected_object = collider print("Olhando para: ", collider.name) label.text = collider.name else: last_detected_object = null label.text = "" else: last_detected_object = null label.text = "" else: last_detected_object = null label.text = "" func _interact_with_object() -> void: if ray_cast_3d.is_colliding(): var collider = ray_cast_3d.get_collider() # Valida se o objeto colidido existe if not is_instance_valid(collider): return # OPÇÃO 1: Item para COLETAR (Adiciona no Autoload Global e faz sumir) if collider.name in objetos_para_coletar: var nome_do_item = collider.name # Incrementa a variável global Global.adicionar_item(nome_do_item) label.text = "" last_detected_object = null collider.queue_free() # Remove o objeto da cena/fase return # OPÇÃO 2: Item para SEGURAR na mão if collider is RigidBody3D and collider.name in objetos_para_segurar: held_object = collider held_object.linear_velocity = Vector3.ZERO print("Pegou o objeto: ", held_object.name) label.text = "Pressione E para soltar " + held_object.name func _drop_object() -> void: if is_instance_valid(held_object): print("Soltou o objeto: ", held_object.name) held_object = null label.text = "" func _move_held_object(_delta: float) -> void: if held_object != null: if not is_instance_valid(held_object): held_object = null label.text = "" return var target_pos = hold_position.global_position var current_pos = held_object.global_position var diff = target_pos - current_pos held_object.linear_velocity = diff * HOLD_STRENGTH extends Node # Variável para contar a quantidade total de itens coletados var itens_coletados: int = 0 # (Opcional) Dicionário para contar a quantidade por cada tipo de item var inventario: Dictionary = { "cesta": 0, "Chave": 0, "Maca": 0 } func adicionar_item(nome_item: String) -> void: itens_coletados += 1 if inventario.has(nome_item): inventario[nome_item] += 1 print("Item coletado: ", nome_item, " | Total geral: ", itens_coletados)