Jump to content
Unity Insider Forum

eigene Klasse in Update() nicht nutzbar.


Supermicha
 Share

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 to comment
Share on other sites

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.

  • Thanks 1
Link to comment
Share on other sites

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. 👍👍👍

  • Like 1
Link to comment
Share on other sites

Freut mich sehr :)

Ich muss das Lob aber auch zurück geben. Deine Fragestellungen sind sehr gut und ausführlich, und haben immer alle wichtigen Infos mit drin. Da muss man nicht raten, und das macht es sehr recht einfach, dir zu helfen ;)

 

  • Thanks 1
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
 Share

×
×
  • Create New...