Jump to content
Unity Insider Forum

eigene Klasse in Update() nicht nutzbar.


Supermicha

Recommended Posts

Hallo zusammen,

mal wieder eine Anfängerfrage an der ich grade scheitere...

Ich habe mithilfe eine schönen Anleitung aus dem Netz (diese hier) es geschafft mir meine eigene Klasse in ein Script zu holen

...
public Building Bakery;

void Start()
{
	Building Bakery = new Building();
	Bakery.name = "Bäckerei";

	Debug.Log(Bakery.name);
}

Das funktioniert problemlos.
Wenn ich jetzt aber die Debug.Log Ausgabe testweise in Update() verschiebe kriege ich eine Fehlermeldung:

Zitat

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

Hier der Code der nicht funktioniert...

...
public Building Bakery;

void Start()
{
	Building Bakery = new Building();
	Bakery.name = "Bäckerei";
}

void Update()
{
	Debug.Log(Bakery.name);
}

 

Was mache ich da falsch?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Moin!

Ich erkläre einfach mal (TL;DR weiter unten). So sieht eine Variablendeklaration aus:

Typ name

Damit sagst du, dass ein Stückchen Speicher klargemacht werden soll, um da etwas reinzuspeichern. Was da reinkommt (ne Zahl, ein Satz, eine Referenz auf ein Objekt...), wird von "Typ" definiert. Der "name" ist dazu da, um ihn woanders im Code zu benutzen, um damit zu sagen, dass man genau diesen Wert auslesen oder ändern will.

Wenn du eine Variablendeklaration in ein Objekt packst (also in einen class-Block, aber außerhalb der darin enthaltenen Methoden), dann wird es diese Variable so lange geben wie das Objekt, in dessen Klasse sie deklariert ist. Wird das Objekt gelöscht, wird der Speicher frei gemacht und zum Wiederverkauf angeboten. Die Variable gibt es dann nicht mehr.

Packst du die Deklaration in eine Methode, dann wird beim Ausführen der Methode die Variable im Speicher erstellt, und wenn die Methode fertig ist, wird die Variable wieder gelöscht.

Variablendeklarationen kann man erweitern, z.B. indem man der frischen Variable direkt einen Wert zuweist.

Typ name = wert;

Das ist das, was du in Start machst. Es ist eine Kombination aus einer Deklaration und einer Zuweisung und nennt sich "Initialisierung". Das bedeutet aber, dass du hier eine neue Variable deklarierst. Die heißt zwar genau wie deine Variable etwas weiter oben in der Klasse (nennt sich dann "Feld"), ist aber eine andere, neue Variable (nennt sich "lokale Variable", da in einer Methode deklariert). Kann auch gut dein dass dir deine IDE da gelb unterstreicht und dich darauf hinweist, dass hier Verwechslungsgefahr mit der anderen Variable besteht, weil sie denselben Namen hat.

(Ab hier das TL;DR:)

Was du eigentlich machen willst, ist keine neue Variable zu deklarieren, sondern der bestehenden Variable einen Wert zuweisen. Du musst dafür aus der Initialisierung eine normale Zuweisung machen, also die Deklaration entfernen. Kurz: statt

Building Bakery = new Building();

machst du

Bakery = new Building();

Damit meinst du dann die bereits in der Klasse deklarierte Variable.

Deine Update-Methode nutzt dieses Feld bereits, aber es kriegt ja aktuell nirgendwo ein Objekt zugewiesen, da Start das Objekt in "seine eigene" Variable packt.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Mist. Wieder die Typendeklaration. Daran muss ich mich echt noch gewöhnen...
mal ganz vergessen, mal (wie hier) doppelt gemoppelt.... was mich das schon an Nerven gekostet hat... 😀

@Sascha Vielen vielen Dank für deine ausführlichen Erklärungen, das ist sicher nicht selbsverständlich und sucht man in vielen anderen Foren leider vergebens...

Bei 2 Problemen konntest du mir schon 2 mal nicht nur super weiterhelfen sondern hast gleich noch eine lehrbuchartige Erklärung mitgeliefert.
Ganz dickes Lob dafür. 👍👍👍

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...