Null Reference Exception in Non-Monobehavour Klasse Unity 2D?

1 Antwort

Zum Zeitpunkt des Zugriffs (also wenn die Schleifenstruktur ausgeführt wird), zeigt die Variable lvlData folglich auf den Wert null. Schau dir die Vorkommen der Variable im kompletten Projekt an. Entweder sie bekommt vor Aufruf von ReadInputLevelData bzw. der Schleife keinen tatsächlichen Wert zugewiesen oder ihr Wert wird von irgendwem zuvor mit null überschrieben.


schleikrabbe 
Beitragsersteller
 25.01.2025, 13:52

Sehr gute Idee ! In einer Klasse "SceneHandler" erscheint lvlData 2x :

LevelData.lvlData = Resources.Load<TextAsset>("LevelSelectLevels/Level" + levelNumber.ToString()).text.Split(Environment.NewLine);

und

LevelData.BoardSize = int.Parse(LevelData.lvlData[2]);

Ich vermute, dass in der 1.Zeile lvlData null ist, weil er die Text-Dateien im Ordner "LevelSelectLevels" nicht findet ! Probiere aus, was am o.g. Code falsch ist, dass in den Resources keine Textdatei gefunden wird ! Zunächst einmal besten Dank.

schleikrabbe 
Beitragsersteller
 28.01.2025, 18:25
@schleikrabbe

Nur als Rückmeldung: Leider gelingt es mir nicht, diesen Fehler zu beheben. Gemäß meinen Recherchen im Internet sollte die Zeile

LevelData.lvlData = Resources.Load<TextAsset>("LevelSelectLevels/Level" + 

                       levelNumber.ToString()).text.Split(Environment.NewLine);

als Aufruf für eine Textdatei in Ordnung sein. Aber okay, ist wohl eine Nummer zu groß für meinen Kennnisstand. Danke dennoch für eine Rückmeldung.

regex9  28.01.2025, 19:14
@schleikrabbe

Den Fall, dass die Leveldateien nicht gefunden werden können, kann man wohl tatsächlich ausschließen, denn sonst würdest du die Exception in dieser Zeile bekommen (Load liefert in dem Fall null, das heißt das Programm müsste versuchen, für ein nicht existentes Objekt ein Property text aufzurufen).

Es kann allerdings sein, dass deine Schleife ausgeführt wird, bevor lvlData jemals ein Wert zugeordnet wird. Also noch bevor die Ressourcen geladen werden. Das kannst du entweder mit einem Debugger (lies auch hier) herausfinden (Breakpoints in der Fehlerzeile und der Zeile mit Load-Aufruf setzen, Projekt starten und schauen, wo das Programm zuerst anhält) oder du baust dir Debug-Logs ein. Mit Ersterem könntest du übrigens einfacher den kompletten Programmablauf Schritt-für-Schritt nachvollziehen.

schleikrabbe 
Beitragsersteller
 29.01.2025, 19:41
@regex9

Besten Dank für Ihre Geduld. Bin nicht gerade bewandert mit Debuggen. Debug.Log setzte ich gerne ein; in diesem Fall hat es mir nicht weitergeholfen. Habe mal bei der o.g. Zeile einen Haltepunkt gesetzt: "Haltepunkt wurde nicht erreicht.Es wurde kein entsprechender Standort gefunden. Speicherort.SceneHandler.cs Zeile 18 Zeichen 9 ("SceneHandler.LoadLevel(int levelNumber)" . public static void LoadLevel(int levelNumber) ist die Methode in der SceneHandler class. In dieser Funktion wird LevelData.LevelNumber = levelNumber aufgerufen. In Resources in einem Ordner LevelSelectLevels befinden sich die Textdateien Level1 bis Level22. Eigentlich sollte hier kein Fehler sein. Oder? Meine Infos sind natürlich nicht umfangreich genug. Falls Sie jedoch Zeit und Lust hätten...github.com/corovcam/pipe-world ist das Projekt, das ich versuche, zum Laufen zu bringen. Aber auch so bin ich Ihnen sehr dankbar. Alles Gute von der Ostseeküste.

regex9  29.01.2025, 23:43
@schleikrabbe

Ich weiß nun zwar nicht sicher, ob das Debuggen bei dir so richtig geklappt hat, doch wenn ich in das GitHub-Projekt schaue, finde ich auch keine Stelle, wo SceneHandler.LoadLevel aufgerufen wird. Ohne diesen Aufruf bleibt lvlData immer null. Die LoadLevel-Methode müsste spätestens in LevelHandler.Start noch vor GenerateLevel aufgerufen werden.

schleikrabbe 
Beitragsersteller
 30.01.2025, 09:26
@regex9

Es ist wohl besser, das Projekt nochmal "liegen" zulassen, was zwar schade ist, weil es das einzige Pipe-Game ist, was ich für Unity finden konnte. Es gab auch mal ähnliche Projekte mit Stromkabeln, die geordnet werden mussten, um den Stromkreis zu schließen, aber für Unity ?? Egal, schließen wir erst einmal das Thema und ich danke ganz herzlich.

regex9  30.01.2025, 13:07
@schleikrabbe

Wenn du es noch einmal aufnimmst und für ein eigenes Projekt nutzen möchtest, wäre es wohl auch gut, nochmal eine etwas andere Struktur zu finden. Die vielen Zugriffe über statische Felder sind kein gutes Design.