Attention: Here be dragons

This is the latest (unstable) version of this documentation, which may document features not available in or compatible with released stable versions of Godot.

Signal

Un tipo integrato che rappresenta un segnale di un Object.

Descrizione

Signal is a built-in Variant type that represents a signal of an Object instance. Like all Variant types, it can be stored in variables and passed to functions. Signals allow all connected Callables (and by extension their respective objects) to listen and react to events, without directly referencing one another. This keeps the code flexible and easier to manage. You can check whether an Object has a given signal name using Object.has_signal().

In GDScript, signals can be declared with the signal keyword. In C#, you may use the [Signal] attribute on a delegate.

signal attacked

# Additional arguments may be declared.
# These arguments must be passed when the signal is emitted.
signal item_dropped(item_name, amount)

Connecting signals is one of the most common operations in Godot and the API gives many options to do so, which are described further down. The code block below shows the recommended approach.

func _ready():
    var button = Button.new()
    # `button_down` here is a Signal Variant type. We therefore call the Signal.connect() method, not Object.connect().
    # See discussion below for a more in-depth overview of the API.
    button.button_down.connect(_on_button_down)

    # This assumes that a `Player` class exists, which defines a `hit` signal.
    var player = Player.new()
    # We use Signal.connect() again, and we also use the Callable.bind() method,
    # which returns a new Callable with the parameter binds.
    player.hit.connect(_on_player_hit.bind("sword", 100))

func _on_button_down():
    print("Button down!")

func _on_player_hit(weapon_type, damage):
    print("Hit with weapon %s for %d damage." % [weapon_type, damage])

Object.connect() or Signal.connect()?

As seen above, the recommended method to connect signals is not Object.connect(). The code block below shows the four options for connecting signals, using either this legacy method or the recommended connect(), and using either an implicit Callable or a manually defined one.

func _ready():
    var button = Button.new()
    # Option 1: Object.connect() with an implicit Callable for the defined function.
    button.connect("button_down", _on_button_down)
    # Option 2: Object.connect() with a constructed Callable using a target object and method name.
    button.connect("button_down", Callable(self, "_on_button_down"))
    # Option 3: Signal.connect() with an implicit Callable for the defined function.
    button.button_down.connect(_on_button_down)
    # Option 4: Signal.connect() with a constructed Callable using a target object and method name.
    button.button_down.connect(Callable(self, "_on_button_down"))

func _on_button_down():
    print("Button down!")

While all options have the same outcome (button's BaseButton.button_down signal will be connected to _on_button_down), option 3 offers the best validation: it will print a compile-time error if either the button_down Signal or the _on_button_down Callable are not defined. On the other hand, option 2 only relies on string names and will only be able to validate either names at runtime: it will generate an error at runtime if "button_down" is not a signal, or if "_on_button_down" is not a method in the object self. The main reason for using options 1, 2, or 4 would be if you actually need to use strings (e.g. to connect signals programmatically based on strings read from a configuration file). Otherwise, option 3 is the recommended (and fastest) method.

Binding and passing parameters:

The syntax to bind parameters is through Callable.bind(), which returns a copy of the Callable with its parameters bound.

When calling emit() or Object.emit_signal(), the signal parameters can be also passed. The examples below show the relationship between these signal parameters and bound parameters.

func _ready():
    # This assumes that a `Player` class exists, which defines a `hit` signal.
    var player = Player.new()
    # Using Callable.bind().
    player.hit.connect(_on_player_hit.bind("sword", 100))

    # Parameters added when emitting the signal are passed first.
    player.hit.emit("Dark lord", 5)

# We pass two arguments when emitting (`hit_by`, `level`),
# and bind two more arguments when connecting (`weapon_type`, `damage`).
func _on_player_hit(hit_by, level, weapon_type, damage):
    print("Hit by %s (level %d) with weapon %s for %d damage." % [hit_by, level, weapon_type, damage])

Note: In a boolean context, a signal will evaluate to false if it's null (see is_null()). Otherwise, a signal will always evaluate to true.

Nota

Ci sono differenze sostanziali quando si usa questa API con C#. Vedi Differenze dell'API C# rispetto a GDScript per maggiori informazioni.

Tutorial

Costruttori

Signal

Signal()

Signal

Signal(from: Signal)

Signal

Signal(object: Object, signal: StringName)

Metodi

int

connect(callable: Callable, flags: int = 0)

void

disconnect(callable: Callable)

void

emit(...) vararg const

Array

get_connections() const

StringName

get_name() const

Object

get_object() const

int

get_object_id() const

bool

has_connections() const

bool

is_connected(callable: Callable) const

bool

is_null() const

Operatori

bool

operator !=(right: Signal)

bool

operator ==(right: Signal)


Descrizioni dei costruttori

Signal Signal() 🔗

Costruisce un Signal vuoto senza oggetto né nome di segnale associato.


Signal Signal(from: Signal)

Costruisce un Signal come copia del Signal specificato.


Signal Signal(object: Object, signal: StringName)

Crea un nuovo oggetto Signal che fa riferimento a un segnale denominato signal nell'oggetto object.


Descrizioni dei metodi

int connect(callable: Callable, flags: int = 0) 🔗

Collega questo segnale al chiamabile callable. È possibile aggiungere anche flags facoltativi per configurare il comportamento della connessione (vedi le costanti di ConnectFlags). È possibile fornire argomenti aggiuntivi al callable connesso tramite Callable.bind().

Un segnale può essere connesso solo una volta allo stesso Callable. Se il segnale è già connesso, restituisce @GlobalScope.ERR_INVALID_PARAMETER e invia un messaggio di errore, a meno che il segnale non sia connesso con Object.CONNECT_REFERENCE_COUNTED. Per evitare ciò, usa prima is_connected() per verificare le connessioni esistenti.

for button in $Buttons.get_children():
    button.pressed.connect(_on_pressed.bind(button))

func _on_pressed(button):
    print(button.name, " was pressed")

Nota: Se l'oggetto del callable è liberato, la connessione sarà persa.


void disconnect(callable: Callable) 🔗

Disconnette questo segnale dal Callable specificato. Se la connessione non esiste, genera un errore. Usa is_connected() per assicurarti che la connessione esista.


void emit(...) vararg const 🔗

Emette questo segnale. Tutti i Callable connessi a questo segnale verranno attivati. Questo metodo supporta un numero variabile di argomenti, quindi i parametri possono essere passati come un elenco separato da virgole.


Array get_connections() const 🔗

Restituisce un Array di connessioni per questo segnale. Ogni connessione è rappresentata come Dictionary che contiene tre voci:

  • signal è un riferimento a questo segnale;

  • callable è un riferimento al Callable connesso;

  • flags è una combinazione di ConnectFlags.


StringName get_name() const 🔗

Restituisce il nome di questo segnale.


Object get_object() const 🔗

Restituisce l'oggetto che emette questo segnale.


int get_object_id() const 🔗

Restituisce l'ID dell'oggetto che emette questo segnale (vedi Object.get_instance_id()).


bool has_connections() const 🔗

Restituisce true se qualsiasi Callable è collegato a questo segnale.


bool is_connected(callable: Callable) const 🔗

Restituisce true se il Callable specificato è collegato a questo segnale.


bool is_null() const 🔗

Restituisce true se questo Signal non ha un oggetto e il nome del segnale è vuoto. Equivale a signal == Signal().


Descrizioni degli operatori

bool operator !=(right: Signal) 🔗

Restituisce true se i segnali non condividono lo stesso oggetto e nome.


bool operator ==(right: Signal) 🔗

Restituisce true se entrambi i segnali condividono lo stesso oggetto e nome.