NullReferenceException: Object reference not set to an instance of an object?
Hallo,
ich habe seit Tagen diesen Fehler bei meinem Unity-Projekt. Aber ich finde den Fehler nicht und weiß auch nicht, was mit dem Fehler gemeint ist.
new_game.cs:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
public class new_game : MonoBehaviour
{
public bool give_pickaxe = false;
public Button new_game_button;
// Start is called before the first frame update
void Start()
{
give_pickaxe = false;
Button btn = new_game_button.GetComponent<Button>();
btn.onClick.AddListener(TaskOnClick);
}
void TaskOnClick()
{
SceneManager.LoadScene("SampleScene", LoadSceneMode.Single);
}
// Update is called once per frame
void Update()
{
}
}
fps_controller:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class fps_controller : MonoBehaviour
{
public new_game newGame;
void Start()
{
Debug.Log("Gestartet!");
}
void Update()
{
if (newGame.give_pickaxe == true)
{
Debug.Log("Test");
}
}
}
2 Antworten
Der Fehler bedeutet, dass du versuchst, ein Attribut/Methode auf einer Variable aufzurufen, die kein Objekt referenziert (= "null" ist).
Da du nicht mitgeteilt hast, in welcher Zeile der Fehler auftritt, kann ich es leider nicht lösen.
Ich rate mal, dass entweder new_game_button oder newGame keinen Wert zugeordnet haben.
Tipp: Such solche Sachen auf Englisch, StackOverflow hilft dir weiter.
Okay, super. Das liegt daran, dass deine Variable "newGame" noch keinen Wert zugeordnet bekommen hat. Das Programm weiß also nicht, welches newGame du meinst, wenn du den boolean give_pickaxe darauf überprüfen möchtest.
Wahrscheinlich möchtest du ein neues new_game zuweisen.
also muss ich im inspector das script drauf legen?
Inspector? Du musst einen Wert zuweisen, zum Beispiel newGame = new new_game();
Welche Instanz soll denn da drin sein? Irgendwo muss sie ja herkommen? Wenn es nicht anders geht, kannst du in new_game eine public static new_game INSTANCE erstellen und in Start() INSTANCE = this setzen. Dann mit new_game.INSTANCE drauf zugreifen. Das ist aber dirty, ist wahrscheinlich anders gedacht. Ich kenne mich mit Unity nicht aus, schau dafür auf StackOverflow oder geh ein Tutorial durch.
auf stack overflow hab ich keine antwort gefunden deswegen hab ich hier gefragt
Ein paar Optimierungen (Coding-Conventions), um deinen Code lesbarer zu machen:
- Lasse immer nur eine freie Zeile, nicht zwei.
- Schreibe die geschweiften Klammern mit einem Space Abstand direkt hinter die Methodendeklaration oder Klassendeklaration, zum Beispiel so:
void Example() {
}
- Verwende keine Unterstriche in Klassen- oder Variablennamen.
Klassenname Beispiel: DasIstEineKlasse
Variablen Beispiel: dasIstEineVariable
- Schreibe nicht "== true", das brauchst du nicht. Die if-Abfrage erwartet sowieso schon einen Boolean.
Wir sind hier bei C#, also sollte man auch die üblichen C# Coding Styles verfolgen.
Schreibe die geschweiften Klammern mit einem Space Abstand direkt hinter die Methodendeklaration oder Klassendeklaration
Die geschweifte Klammer gehört in die neue Zeile nach der jeweiligen Deklaration.
Verwende keine Unterstriche in Klassen- oder Variablennamen
Für private Variablen einer Klasse schon, da gehört ein Unterstrich vor den Namen.
Wenn Du Code Conventions verlinkst, dann doch auch bitte die für C# und nicht für Java.
https://docs.microsoft.com/en-us/dotnet/csharp/fundamentals/coding-style/identifier-names
https://docs.microsoft.com/en-us/dotnet/csharp/fundamentals/coding-style/coding-conventions
Ups bin nur drüber geflogen und sah nach Java aus 😅 sind ja auch 2 sehr ähnliche sprachen
Der fehler ist in fps_controler zeile 15 also das hier: if(newGame.give_pickaxe == true){
Debug.Log("Test");
}