Come posso risolvere l'errore 'NullReferenceException' in C# su Unity?

👤 Iniziato da @cVargas968
📅 27/11/2025 23:00
📁 Programmazione 🌐 IT
Avatar di cVargas968
Ciao a tutti, sto lavorando a un progetto in Unity 2023.1 usando C# e mi trovo davanti a un fastidioso errore NullReferenceException che non riesco a debuggare bene. Ho già controllato che gli oggetti siano assegnati nel Inspector, ma l'errore continua a comparire quando provo ad accedere a una variabile di un componente. Ecco un esempio semplificato del codice:

```csharp
public class PlayerController : MonoBehaviour {
public Rigidbody rb;

void Start() {
rb.AddForce(Vector3.up * 10);
}
}
```

L'errore esatto è: "NullReferenceException: Object reference not set to an instance of an object" e si verifica alla riga con rb.AddForce. Ho provato a fare il debug stampando rb ma risulta null. Qualcuno sa come posso assicurarmi che il riferimento a Rigidbody sia correttamente assegnato o se c'è qualche trucchetto per evitare questo problema? Grazie mille per qualsiasi consiglio o esperienza simile!
Avatar di zoecolombo15
Oh, che frustrazione, lo so bene! La NullReferenceException è il classico errore che ti fa perdere ore di sonno. Prima di tutto, controlla se hai davvero assegnato il Rigidbody nell'Inspector: a volte sembra assegnato ma magari è un prefab sovrascritto o un riferimento perso.

Prova a fare così: nel metodo `Awake()` (che viene chiamato prima di `Start()`), aggiungi un controllo:

```csharp
void Awake() {
if (rb == null) {
rb = GetComponent<Rigidbody>();
if (rb == null) {
Debug.LogError("Rigidbody non trovato! Assicurati che il GameObject ne abbia uno.");
}
}
}
```

Se il problema persiste, potrebbe essere che il GameObject a cui è attaccato lo script non ha un Rigidbody. In quel caso, aggiungilo via codice con `gameObject.AddComponent<Rigidbody>()` (ma attenzione, perché potrebbe non essere la soluzione ottimale).

E se proprio non ne vuoi sapere, usa il pattern "defensive programming": prima di usare `rb`, controlla sempre se è null! 😉

Fammi sapere se risolvi, altrimenti ci ragioniamo insieme!
Avatar di priscalombardi98
@cVargas968, concordo con @zoecolombo15, ma vorrei aggiungere un paio di dettagli che potrebbero salvarti la giornata. Innanzitutto, se hai già controllato l'Inspector, il problema potrebbe essere più subdolo: magari il GameObject è disattivato o il componente Rigidbody è stato rimosso a runtime.

Prova a modificare il codice così:

```csharp
void Awake() {
if (rb == null) {
rb = GetComponent<Rigidbody>();
}

if (rb == null) {
Debug.LogError("Nessun Rigidbody trovato su " + gameObject.name + ". Ne aggiungo uno automaticamente.");
rb = gameObject.AddComponent<Rigidbody>();
}
}
```

Se il problema persiste, potresti avere un caso di serializzazione corrotta. Prova a:
1. Chiudere e riaprire Unity
2. Ricreare lo script da zero (a volte i file .meta si corrompono)
3. Controllare che non ci siano errori di compilazione prima di entrare in Play Mode

E se proprio non funziona, butta tutto e passa a Godot. Scherzo... o forse no? 😈 Comunque, fammi sapere se risolvi!
Avatar di cVargas968
@priscalombardi98 grazie mille per il tuo intervento, davvero prezioso! Non avevo considerato che il Rigidbody potesse essere stato rimosso a runtime o che il GameObject fosse disattivato, hai ragione, sono dettagli che spesso sfuggono. La tua modifica al codice è molto intelligente, aggiungere il componente automaticamente evita molti mal di testa, lo proverò subito. Anche il consiglio sulla serializzazione corrotta è utilissimo, non avevo pensato di ricreare lo script da zero. Per ora sto testando tutte queste soluzioni e sembra che il problema stia per essere risolto. Ti terrò aggiornato! E riguardo Godot... beh, mai dire mai! 😄 Grazie ancora, la community è davvero un tesoro!

La Tua Risposta

💬

Vuoi partecipare alla discussione?

Accedi o registrati per scrivere la tua risposta e unirti alla conversazione!