Szenenübergreifende Datenübertragung in Unity - Anwendung mehrerer Werte auf die einfache Spieleentwicklung

Dieser Artikel ist nützlich für Entwickler von Anfängerspielen. Darin werde ich über meine eigenen Erfahrungen bei der Implementierung mehrstufiger Interaktionen und die Probleme sprechen, auf die ich gestoßen bin.

Lassen Sie uns über statische Klassen zum Speichern von Daten, verschiedene Möglichkeiten zum Laden von Szenen mit der Unity-Engine und den Fall der Verbindung von Admob mit dem Projekt sprechen. Informationen aus offiziellen Unterlagen und einer freundlichen Entwicklergemeinschaft.

Die Situation


Mein Spiel besteht aus zwei Szenen - dem Hauptmenü, das unmittelbar nach dem Laden sichtbar ist, und direkt einer Spielszene mit Mechanik, in die je nach ausgewählter Option das Fertighaus des Objekts geladen wird. Es war mir nicht möglich, sie zu einer Szene zu kombinieren, da mehrere ziemlich komplexe Objekte mit dem Menü verknüpft sind und es bequemer ist, Entitäten zu trennen.

Früher habe ich nur ein bestimmtes Controller-Objekt zum Speichern der Daten verwendet, aber mit dem Entladen der Szene hört es auf zu existieren.

Datenübertragung (statische Klasse)


Es stellte sich heraus, dass Unity hervorragend mit Code arbeiten kann, auch wenn es friedlich in einer Datei im Skriptordner liegt und nicht von einer Komponente an ein Objekt auf der Bühne angehängt wird (dies war für Anfänger nicht offensichtlich). Eine solche Datei könnte beispielsweise eine statische Klasse dieser Art sein:

using UnityEngine; public static class DataHolder { private static GameObject prefabName; public static GameObject Prefab { get { return prefabName; } set { prefabName = value; } } } 


Auf diese Weise konnte ich die Auswahl des Benutzers auch nach dem Entladen der Szene und dem Laden einer neuen speichern. Anfangs funktionierte alles genau mit harten Wechselszenen.

Mit diesem Mechanismus können Sie Einstellungen aus dem Menü auch auf andere Szenen übertragen, z. B. die Lokalisierungssprache, Einstellungen für Sounds und Musik und vieles mehr.

Multi-Value (SceneManagement)


Alles passte zu mir und so, bis ich die Aufgabe erhielt, mich mit dem Admob-Projekt (Werbung) zu verbinden, so dass das Video gleich zu Beginn der Spielszene gezeigt wurde. Wie sich herausstellte, gibt es Feinheiten: Das Anfordern eines Videos nimmt viel Zeit in Anspruch und es hat einfach keine Zeit, beim Wechseln von Szenen anzukommen. Ich wollte keine zusätzlichen Verzögerungen im Projekt verzögern, zumal wir viel Zeit haben, bis der Spieler sich an das Menü hält. Dann fand ich heraus, dass es nicht notwendig ist, Szenen „hart“ zu wechseln, da es eine wunderbare Option für das additive Laden gibt (ohne die vorherige Szene zu entladen).

Ich lade die Spielszene mit dem Menü-Controller (die Szene mit dem Menü und dem Werbeobjekt bleibt ebenfalls geladen):

 SceneManager.LoadScene(1,LoadSceneMode.Additive); 

Nach Abschluss des Levels entlade ich die Spielszene mit dem Gamecontroller (damit sie nicht in meinem Gedächtnis hängt):

 SceneManager.LoadScene(0,LoadSceneMode.Single); 

Mit einem solchen Schema wird die Werbung sofort zu Beginn der Anwendung geladen, und Sie können die Anzeige des Werbespots jederzeit aufrufen. Sie können dasselbe mit allen Objekten tun, die Sie benötigen.

Die Probleme


Leider können Sie selbst mit dem additiven Laden von Szenen nicht in Objekte einer Szene aus einer anderen eintauchen. Links zu Objekten müssen über einen bestimmten „Mediator“ übertragen werden (in meinem Fall wurde dieselbe statische Klasse verwendet).

Seien Sie vorsichtig, wenn Sie Fertighäuser instanziieren, wenn mehrere Szenen aktiv sind - für mich haben alle beschlossen, auf die falsche Szene zu stoßen (mehr dazu ein anderes Mal).

Source: https://habr.com/ru/post/de440718/


All Articles