Godot: risolvere errori null instance

Godot Engine

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.

Panoramica del debugger

Focalizzatevi sul codice. Vedete quella piccola freccia verde nella parte sinistra dell'editor?

Debugger

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.

Screenshot dell'errore

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.

Errore highlight

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:

  1. Leggere cos'è il debugging su Wikipedia
  2. 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.