Jump to content
Unity Insider Forum

NullReferenceException: Object reference not set to an instance of an object


Elharter

Recommended Posts

Hallo,

 

ich habe ein seltsames Problem.

 

Ich habe verschiedene Scripte die "Labels/Text/GUI" befüllen.

Es ist immer das selbe GUI mit den selben Labels > Siehe Screenshot.

 

Ich befülle Username, Bestround, Lastround erfolgreich immer in der selben Vorgehensweise.

 

public UILabel lastlaptime; (ist ein UILabel Script)

public UILabel bestlaptime;(ist ein UILabel Script)

 

Im Inspector ziehe ich das GameObject an die passende Stelle > alles wunderbar, funktioniert.

 

Jetzt wollte ich das - wie 3x zuvor genauso für die Rundenanzeige durchführen. In dem dazugehörigen Script.

 

Label: round_player

public UILabel roundText;

 

(ich schreibe die aktuelle Runde im Checkpoint Script)

 

using UnityEngine;
using UnityEngine.UI;
using System.Collections;
public class checkpoint : MonoBehaviour {
public UILabel roundText;
//public Text laptimeText;
public Transform playerTransform = null;
void Start ()
{


}
void OnTriggerEnter ( Collider other )
{
	//Debug.Log("own:"+transform.position);
	//Debug.Log("currentCheckpoint:"+Laps.checkpointA[Laps.currentCheckpoint].transform.position);
	if (other.gameObject.tag == "Player")
	{
		//Debug.Log("Trigger detected");
		//Is it the Player who enters the collider?
		//if (!other.CompareTag ("Player"))
		// return; //If it's not the player dont continue

		if (transform == Laps.checkpointA[Laps.currentCheckpoint].transform)
		{
			//Debug.Log ("it IS the player");
			//Check so we dont exceed our checkpoint quantity
			if (Laps.currentCheckpoint + 1 < Laps.checkpointA.Length)
			{
				//Add to currentLap if currentCheckpoint is 0
				if (Laps.currentCheckpoint == 0)
				{
					Laps.currentLap++;
					if (Laps.timeStarted == false)
					{
						Laps.timeStarted = true;
						Laps.finished = false;
					}
					else
					{
						Laps.finished = true;
					}
				}
				Laps.currentCheckpoint++;
			}
			else
			{
				//If we dont have any Checkpoints left, go back to 0
				Laps.currentCheckpoint = 0;
			}
			roundText.text = "Round:" + Laps.currentLap +"/0 (" + Laps.currentCheckpoint + ")";
			//laptimeText.text = "Checkpoint: " + Laps.currentCheckpoint + " Lap: " + Laps.currentLap;
		}
	}
}
}

 

Ich erhalte eine NullReferenceException.

 

NullReferenceException: Object reference not set to an instance of an object

checkpoint.OnTriggerEnter (UnityEngine.Collider other) (at Assets/Scripts/checkpoint.cs:57)

 

Hinweis: bastel ich das selbe mit "public Text laptimeText;" lege dazu ein UI-Text Element an, ziehe es im Inspector drauf und kommentiere Zeile 52 aus und aktiviere Zeile 53 funktioniert das problemlos.

 

Versteh ich nicht.

Wieso???

 

danke

post-5619-0-09138000-1466758589_thumb.jpg

Link zu diesem Kommentar
Auf anderen Seiten teilen

Kann auch sein, dass dein UILabel keine Text-Eigenschaft hat. Du hast einen Haufen Debug.Log Zeilen drin, mach doch mal vor der Zeile mit dem Fehler ein Debug.Log und lass dir ausgeben, ob roundText != null, roundText.text != null, und Lap != null. Alternativ:

 

string message = "Round:" + Laps.currentLap +"/0 (" + Laps.currentCheckpoint + ")";
roundText.text = message;

Dieses an und für sich überflüssige Konstrukt zeigt dir, ob der Fehler in der ersten oder zweiten Zeile auftritt. In der ersten Zeile: Fehler liegt in Laps. Zweite Zeile: Fehler liegt in roundText.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Kann auch sein, dass dein UILabel keine Text-Eigenschaft hat. Du hast einen Haufen Debug.Log Zeilen drin, mach doch mal vor der Zeile mit dem Fehler ein Debug.Log und lass dir ausgeben, ob roundText != null, roundText.text != null, und Lap != null. Alternativ:

 

string message = "Round:" + Laps.currentLap +"/0 (" + Laps.currentCheckpoint + ")";
roundText.text = message;

Dieses an und für sich überflüssige Konstrukt zeigt dir, ob der Fehler in der ersten oder zweiten Zeile auftritt. In der ersten Zeile: Fehler liegt in Laps. Zweite Zeile: Fehler liegt in roundText.

 

Habe das genau so probiert.

 

Ergebnis:

NullReferenceException: Object reference not set to an instance of an object

checkpoint.OnTriggerEnter (UnityEngine.Collider other) (at Assets/Scripts/checkpoint.cs:59)

 

58:string message = "Round:" + Laps.currentLap + "/0 (" + Laps.currentCheckpoint + ")";

59:roundText.text = message;

 

UILabel Class Beschreibung ist hier: http://www.tasharen.com/ngui/docs/class_u_i_label.html

 

Auszug:

string UILabel.text getset

 

Text that's being displayed by the label.

 

 

Und das witzige ist, ich verwende es ja genauso an 3 anderen Stellen wo es klaglos funktioniert.

Noch seltsamer ist dass trotz Exception alles angezeigt wird - bis auf die Anzahl der Checkpoints (Laps.currentCheckpoint).

 

Habe auch testweise Laps.currentCheckpoint rausgenommen.... ändert nichts.

 

Was mir noch aufgefallen ist, die Exception kommt erst beim durchführen des 2ten Checkpoints

Link zu diesem Kommentar
Auf anderen Seiten teilen

Nachdem jetzt feststeht, dass roundText der böse Bube ist:

 

vor die Zeile 59:

Debug.Log("roundText is null: " + roundText == null);

Da kommt dann mit Sicherheit "true" raus. Die entscheidende Info ist, dass der Fehler erst beim zweiten Checkpoint kommt. Dazwischen muss dann halt der roundText genullt werden. Irgendwo.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ok....ich habe mir jetzt einen erweiterten LogViewer installiert (https://www.assetstore.unity3d.com/en/#!/content/12047)

 

Dort sehe ich schon beim starten der Scene (Play) folgenden Fehler:

NullReferenceException: (null)

UnityEditor.SerializedObject..ctor (UnityEngine.Object[] objs) (at C:/buildslave/unity/build/artifacts/generated/common/editor/SerializedPropertyBindings.gen.cs:74)

UnityEditor.Editor.GetSerializedObjectInternal () (at C:/buildslave/unity/build/artifacts/generated/common/editor/EditorBindings.gen.cs:154)

UnityEditor.Editor.get_serializedObject () (at C:/buildslave/unity/build/artifacts/generated/common/editor/EditorBindings.gen.cs:147)

NGUITransformInspector.OnEnable () (at Assets/NGUI/Scripts/Editor/NGUITransformInspector.cs:23)

 

 

Könnte mir vorstellen dass dieser Fehler zum anderen führt. Ich versuche mal diesen Fehler weg zu bekommen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also als du deinen Startpost geschrieben hast, hast du in deinem Coude UGUI (Unity's neue GUI) genutzt.

roundText ist ein UILabel, die uGUI Komponenten sind auskommentiert und kommen da nicht vor.

 

Ich nutze NGUI genau ja...

Ist UGUI besser?

Also ich schreibe zu einem Vergleich zwischen den beiden gerade eine Bachelorarbeit (der praktische Teil ist abgeschlossen, jetzt muss ich das nur noch in eine schriftliche Arbeit verpacken ^^) und ich würde in fast jedem Fall uGUI empfehlen.

 

Argumente für uGUI:

- Bei einem vergleichbaren Knowhow zu den beiden Frameworks kommt man mit uGUI schneller ans Ziel, weil mittlerweile vieles Out-of-the-Box läuft und nicht viel konfiguriert werden muss (dadurch bleibt auch das Projekt sauberer, weil weniger Komponenten rumliegen). Das sieht man besonders bei Scrollviews/Grids und Sprite-Atlanten

- Dahinter steht ein großes Entwicklerteam

- Es ist performanter (Erzeugt auch weniger Tris/Verts, Batches und Setpass Calls)

- Das (Event)System ist besser erweiterbar und man kann das Verhalten der UI einfacher kontrollieren

 

Das einzige Argument das man gegen uGUI und für NGUI bringen könnte wäre - meiner Meinung nach -, dass man in uGUI mehr programmieren muss, um es auch voll auszunutzen. Gerade so Drag-and-Drop Geschichten muss man selber implementieren, da gibt's in NGUI schon was vorgefertigt.

Tweening kann man auch easy selber schreiben oder - wie z.B. auch das in uGUI fehlende Lokalisierungssystem - im Asset Store free laden.

Bist du ein programmierscheuer Designer und allein im Team, dann wäre wohl NGUI die bessere Variante. Für alles andere wäre imo uGUI besser.

Das Unternehmen bei dem ich die Bachelorarbeit absolviere steigt demnächst übrigens auch von NGUI auf uGUI um.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...