Godot Version 4.4.1
Question
I have problem to connect callables, I try to make interactions but the only thing that still has some problems is the call to the callable.
the error is "interaction_manager.gd:34 @ _input(): The InputMap action “interact” doesn’t exist. Did you mean “interaction”?
those are the codes:
extends Area2D
class_name InteractionArea
@export var action_name: String = “interact”
var interact: Callable = func():
pass
func _ready() → void:
if not body_entered.is_connected(_on_body_entered):
body_entered.connect(_on_body_entered)
if not body_exited.is_connected(_on_body_exited):
body_exited.connect(_on_body_exited)
func _on_body_entered(body: Node2D) → void:
if body.is_in_group(“player”):
InteractionManager.register_area(self)
func _on_body_exited(body: Node2D) → void:
if body.is_in_group(“player”):
InteractionManager.unregister_area(self)
###the second code is:
extends Node2D
@onready var player = get_tree().get_first_node_in_group(“player”)
@onready var label: Label = $Label
const base_text = "[E] to "
var active_area: Array[InteractionArea] =
var can_interact := true
func register_area(area: InteractionArea) → void:
if not active_area.has(area):
active_area.append(area)
func unregister_area(area: InteractionArea) → void:
active_area.erase(area)
func _process(_delta: float) → void:
if active_area.size() > 0 and can_interact:
active_area.sort_custom(_sort_by_distance_to_player)
var area := active_area[0]
label.text = base_text + area.action_name
label.global_position = area.global_position
label.global_position.y -= 36
label.global_position.x -= label.size.x / 2
label.show()
else:
label.hide()
func _sort_by_distance_to_player(a: InteractionArea, b: InteractionArea) → bool:
return player.global_position.distance_to(a.global_position) < player.global_position.distance_to(b.global_position)
func _input(event: InputEvent) → void:
if event.is_action_pressed(“interact”) and can_interact and active_area.size() > 0:
can_interact = false
label.hide()
await active_area[0].interact.call()
can_interact = true