Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Renegade

Alter Hase

Beiträge: 494

Wohnort: Berlin

Beruf: Certified Unity Developer

  • Private Nachricht senden

11

19.01.2014, 13:42

Ok. Das Problem ist, das ich eine NUllReferenceException bekomme, wenn ich versuche dieses Skript, welches in einer anderen Scene nur verwendet wird, in meinem Skript, was an der Kamera in dieser Scene hängt, zu initialisieren.

Das ist das Problem. Und ich koennte auch ein neues bauen, möchte aber auf das schon in der 1.Scene vorhandene verweisen und damit weiterzuarbeiten.


Geh doch mal bitte auf Sacaldurs Frage ein. Das ist nicht das eigentlich Problem was du beschreibst, sondern ein auftretender Fehler - nämlich eine Exception.
Im Allgemeinen möchte ich mal an dieser Stelle sagen, da du in letzter Zeit öfters Fragen zu Unity stellst (was gut ist!), dass du mehr auf das Eigentliche eingehen musst als uns ein Problem innerhalb deiner Denkweise zu erklären.

Ich würde auch gerne mal wissen warum du gerne etwas aus einer anderen Szene initialisieren möchtest.

Warum nicht das Script in beide Szenen hinzufügen - per Code oder händisch? Vielleicht meinst du auch Object.DontDestroyOnLoad? Vielleicht meinst du aber auch eine Art Parametrisierung über Szenen hinweg. Ich kann nur mutmaßen.
Liebe Grüße,
René

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

12

19.01.2014, 14:23

Mir scheint es ein wenig so als wenn du ein falsches Verständnis von Unity hast. Szenen sind an sich in sich geschlossen. Das soll heißen, wenn eine Szene geladen ist, dann sind alle anderen Szenen entladen (zumindest wäre mir das neu, dass es anders geht). Das heißt, du solltest deine Szenen als einzelne von einander unabhängige Komponenten betrachten. Willst du ein Objekt von einer Szene mit in die nächste Szene übernehmen, so hilft dir dabei DontDestroyOnLoad. Das wurde ja jetzt mehrfach vorgeschlagen. Falls mein hier beschriebenes Verständnis von Unity Szenen totaler Schwachsinn war korrigiert mich bitte gerne:)
Jetzt kommen wir zu Sacaldurs Punkt. Eben weil deine Vorstellung von Unity und dem Scenemanagement nicht ganz richtig ist, ist deine Denkweise vermutlich nicht optimal um dein eigentliches Problem zu lösen. Dein Ziel war es ja eigentlich nicht irgendein Skript von einer Szene zu übernehmen, sondern eigentlich wolltest du irgendeine Sache in deinem Spiel umsetzen. Dazu hat Sacaldur gemutmaßt, dass es sich zum Beispiel um einen Highscore handelt, oder um Daten für den Spieler, die dann in mehreren Szenen vorhanden sein sollen. Dein Lösungsansatz ist also Daten bzw ein Skript über mehrere Szenen zu halten. Vielleicht gibt es aber bessere Lösungsansätze für dein Problem. Dafür müssen wir aber dein eigentliches Problem kennen. Also im Prinzip das was du eigentlich umsetzen wolltest und weshalb du überhaupt erst auf die Idee gekommen bist. Beschreib uns doch einfach mal das und dann gucken wir mit dir zusammen ob es nicht eine bessere Möglichkeit gibt.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Renegade

Alter Hase

Beiträge: 494

Wohnort: Berlin

Beruf: Certified Unity Developer

  • Private Nachricht senden

13

19.01.2014, 14:40

Das soll heißen, wenn eine Szene geladen ist, dann sind alle anderen Szenen entladen (zumindest wäre mir das neu, dass es anders geht)


Nicht ganz. Es ist möglich, Szenen additiv zu laden (Application.LoadLevelAdditive, auch Async).
Ist in manchen Fällen äußerst nützlich - allen voran das dynamische Laden von Content zum Beispiel bei sehr großen Maps.
Kleine Story von der Arbeit:
Ich hatte vor einiger Weile einen Auftrag in einer Firma für eine Bug-Evaluierung. Das dortige Entwickler-Team hat ihr Szenen-Management so aufgebaut, dass der Spieler aus einer gesonderten Szene zum restlichen Level geladen wurde.
Der Vorteil war, dass die Programmierer in anderen Szenen als die Designer die Funktionalität des Spielers testen konnten und trotzdem sichergestellt haben, dass die gleichen Einstellungen für den Spieler wie im restlichen Spiel vorlagen.
Dafür hatten sie eine sehr coole kleine Debugging-Szene.
Liebe Grüße,
René

De_Struktor

unregistriert

14

19.01.2014, 20:27

Ich verstehe worauf ihr hinaus wollt. Meine "Problembeschreibung" war doch eher wenig nützlich, dafür entschuldige ich mich.

Ich möchte ein High-Score Menü bauen. Um das zu realisieren, wollte ich ein Skript einer anderen Scene nutzen, welches Daten dafür speichert. Dieses Skript muss ich in dem Highscoremenü initialisieren. Und ich bekomme diese Exception, weil dieses Objekt nicht gefunden werden kann über: skript = GameObject.FindObjectWithTag("MainCamera").GetComponetn<Skritp>(); Ist auch klar, denn an der MainCamera hängt ja nichts und ich will das skript holen, das an dieser Kamera hängt und hängen tut es in der anderen Scene!

Ich hoffe, dieses mal habe ich mich verständlich ausgedrückt(nicht sakastisch gemeint^^)

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

15

19.01.2014, 20:44

Entweder verwendest du eine Klasse mit statischen Methoden oder du verwendest ein Skript für die Spielszenen (dort, wo die Highscores erzeugt werden) und hängst dieses je 1 Mal in jede Szene.
In beiden Fällen könntest du im Hintergrund auf die PlayerPrefs zugreifen, wenn eine Klasse mit statischen Methoden verwendet wird, könnten auch statische Variablen verwendet werden.
Es ist grundsätzlich zwar auch möglich, DontDestroyOnLoad aufzurufen, allerdings muss man bei all diesen GameObjects berücksichtigen, wann diese erzeugt/hinzugefügt werden, in welchen Szenen sie erhalten bleiben dürfen und wann sie entfernt werden dürfen. Wenn im Hintergrund auf die PlayerPrefs o. ä. zurückgegriffen wird, gibt es keinen Grund, ein GameObject über mehrere Szenen hinweg beibehalten zu wollen. (Sich dies zu ersparen, macht die Sache grundsätzlich auch einfacher, aber das ist nur meine Meinung.)

@Schorsch:
Es könnten höchstens ein paar Details sein, die beim Szenenwechsel noch relevant sein könnten (bspw. werden grundsätzlich erst alle Objekte destroyt, wozu auch der Aufruf von OnDestroy gehört, Ausnahmen wurden hier bereits 2 genannt, und dann wird die neue Szene geladen und initialisiert (Awake und Start)), allerdings ist es im Groben (soweit ich weiß) richtig. ;)
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

Werbeanzeige