Supermicha Posted September 22, 2022 Report Share Posted September 22, 2022 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? Quote Link to comment Share on other sites More sharing options...
Sascha Posted September 22, 2022 Report Share Posted September 22, 2022 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. 1 Quote Link to comment Share on other sites More sharing options...
Supermicha Posted September 22, 2022 Author Report Share Posted September 22, 2022 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. 👍👍👍 1 Quote Link to comment Share on other sites More sharing options...
Sascha Posted September 22, 2022 Report Share Posted September 22, 2022 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 1 Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.