Godot: risolvere errori null instance
Pubblicazione: 5/27/2020
Ho ricevuto spesso richieste di aiuto per problemi con GDScript del tipo:
Invalid set index 'position' (on base: 'null instance') [...]
Invalid operands 'Nil' and [...]
Chi si blocca di fronte a questo genere di problemi, probabilmente si sta appena avvicinando al mondo della programmazione.
L’aiuto migliore che posso dare è spiegare cosa sia una null instance
e
spiegare quali strumenti esistono in Godot (ma non solo) per risolvere questi
errori.
Una volta capito questo, affronterete questi errori in autonomia e con più consapevolezza.
Cos’è “null”?
Null è un tipo di dato che rappresenta un qualcosa di indefinito o inesistente; un tipo di dato su cui non sono definite proprietà e su cui non si possono effettuare operazioni.
Detto così non aiuta molto, quindi vediamo un esempio di GDScript.
var a = 10
Questa scrittura salva il numero 10
(un valore di tipo intero, per essere
precisi) all’interno della variabile a
.
Proviamo ora ad analizzare questo codice:
var x
Questa istruzione GDScript è valida e viene eseguita senza problemi.
Cosa contiene ora x
? Qual’è il suo valore?
Se state pensando “x non contiene niente”, la risposta è sbagliata.
x
contiene qualcosa e quel qualcosa viene interpretato come null
.
Per convincervi provate ad eseguire questo codice:
var x
var y = null
if x == y:
print("x è considerato uguale ad y")
Eseguendo questo codice verifichiamo che x
viene valutato uguale ad y
.
Questo è solo un esempio giocattolo, ma serve per capire che alcune variabili
(ed anche alcune espressioni) possono essere interpretate come null
durante
l’esecuzione del programma.
Ora vediamo un esempio reale dove può capitare di avere un valore nullo, senza crearlo ad-hoc come ho fatto in questo esempio.
Per capire a fondo il concetto di
null
bisognerebbe parlare di gestione della memoria dei computer ed anche dell’elettronica di cui sono composti. In questa guida però mi focalizzerò su Godot, tralasciando questi dettagli.
Esempio - Referenziare un percorso invalido
Supponiamo di avere una scena su Godot con un Node2D
come root
ed una Sprite
come unico nodo della scena.
Nota: tutti i discorsi fatti riguardo il nodo “null” e lo scripting valgono sia per il 2D che per il 3D.
Supponiamo di voler nascondere la sprite appena il gioco viene avviato. Per farlo
aggiungiamo questo script a Node2D
:
extends Node2D
func _ready():
var sprite = get_node("Sprit") # oppure la notazione alternativa "$Sprit"
sprite.hide()
Nello script c’è un errore di battitura: il parametro che passiamo alla funzione
get_node
dovrebbe essere Sprite
e non Sprit
.
Se eseguiamo comunque quel codice, si ottiene questo errore:
Attempt to call function 'hide' in base 'null instance' on a null instance.
Significa che abbiamo provato ad accedere ad una funzione chiamata
hide
da un oggetto null
.
Risolvere l’errore
Godot aiuta molto lo sviluppatore in questi casi.
Ogni volta che c’è un errore, aprirà l’editor integrato mostrandovi il file che contiene l’errore. In questo modo non dobbiamo cercare all’interno di decine di script prima di trovare l’errore.
Focalizzatevi sul codice. Vedete quella piccola freccia verde nella parte sinistra dell’editor?
Quella freccia sta ad indicare che Godot ha fermato l’esecuzione del gioco in quel punto.
Ora per capire ancora più a fondo cosa stia accadendo, guardate nella sezione debugger che si trova nella parte inferiore di Godot.
Qui troviamo una scritta rossa con il messaggio di errore. Questo è quello che ci fornisce informazioni (o indizi, se preferite) su dove andare a cercare il nostro problema.
Prima di tornare sul codice, guardate la parte destra del debugger: c’è una lista di variabili con i rispettivi valori.
In questo semplice esempio abbiamo solo una variabile sprite
(freccia 1)
con valore null
(freccia 2).
Ora possiamo intuire che deve esserci stato un errore
nell’inizializzazione di sprite
. Riprendiamo il codice e correggiamo
la riga 5 scrivendo:
var sprite = get_node("Sprite")
Eseguendo di nuovo il codice, il gioco partirà senza errori.
Conclusioni
Gli errori dovuti a valori null possono avvenire per molti motivi, non soltanto quando si sbaglia a scrivere il nome di un nodo. Ma l’approccio per risolverli è sempre lo stesso.
Il debugger vi offrirà sempre utili indizi quindi prendete confidenza con questo strumento il più presto possibile.
Se volete approfondire questa parte vi consiglio di:
- Leggere cos’è il debugging su Wikipedia
- Studiare e sperimentare con i breakpoint seguendo la documentazione ufficiale di Godot
Spero che questa guida vi sia stata di aiuto e vi abbia dato spunti per studiare e migliorare come sviluppatori di videogiochi.
Buon gamedev ed alla prossima.
SUPPORTAMI
Questo sito web è privo di pubblicità ed i contenuti vengono rilasciati con licenze libere come CC-BY-SA e GPL.
Se i contenuti ti piacciono e ti sono stati utili, considera di supportare il progetto.
Visita la pagina supporter.