Engine & platform

Wechseln Sie in Unity 2019.3 schneller in den Wiedergabemodus

ALEXEY ZAKHAROV / UNITY TECHNOLOGIESContributor
Nov 5, 2019|5 Min.
Wechseln Sie in Unity 2019.3 schneller in den Wiedergabemodus
Diese Website wurde aus praktischen Gründen für Sie maschinell übersetzt. Die Richtigkeit und Zuverlässigkeit des übersetzten Inhalts kann von uns nicht gewährleistet werden. Sollten Sie Zweifel an der Richtigkeit des übersetzten Inhalts haben, schauen Sie sich bitte die offizielle englische Version der Website an.

Der Spielmodus ist der Kern dessen, was die Arbeit mit Unity so unterhaltsam macht. Wenn Ihre Projekte jedoch komplexer werden, kann es eine Weile dauern, bis Sie beginnen können. Je schneller Sie den Wiedergabemodus aktivieren und beenden können, desto schneller können Sie Änderungen vornehmen und testen. Aus diesem Grund führen wir in der Beta von Unity 2019.3 den konfigurierbaren Enter Play-Modus als experimentelle Funktion ein.

Wenn Sie derzeit im Editor in den Wiedergabemodus wechseln, führt Unity zwei Dinge aus: Es setzt die Skriptzustände zurück (Domain Reload) und lädt die Szene neu. Dies braucht Zeit, und je komplexer Ihr Projekt wird, desto länger müssen Sie warten, um neue Änderungen im Wiedergabemodus zu testen. Ab der Betaversion von Unity 2019.3 haben Sie jedoch die Möglichkeit, die Aktionen „Domäne neu laden“ und „Szene neu laden“ oder beide zu deaktivieren.

Unseren Testergebnissen zufolge können Sie hierdurch, abhängig von Ihrem Projekt, bis zu 50–90 % der Wartezeit einsparen.

Bild

Wenn Sie „Optionen für den Wiedergabemodus aktivieren“ unter „Datei“ > „Projekteinstellungen“ > „Editor“ aktivieren, werden die Optionen zum Neuladen der Domäne und zum Neuladen der Szene verfügbar. Weitere Einzelheiten finden Sie in der Dokumentation unter „So konfigurieren Sie den Wiedergabemodus“ .

Bild

Mit diesen Optionen können Sie das Neuladen von Domänen und/oder Szenen aus dem Vorgang „Enter Play Mode“ deaktivieren, wenn keine Codeänderungen vorliegen. Sie können auf diese Funktion auch über eine API und einen Rückruf zugreifen, wenn Sie den Spielstatus zurücksetzen möchten, bevor Sie in den Spielmodus wechseln.

Das folgende Diagramm zeigt den Vorgang „Enter Play Mode“ vor und nach der Deaktivierung von „Reload Domain“ und „Reload Scene“:

Bild

Weitere Einzelheiten zu den Prozessen, die Unity beim Wechsel in den Wiedergabemodus durchläuft, finden Sie in der Dokumentation.

Beachten Sie, dass diese Funktion derzeit experimentell ist und nicht alle Unity-Pakete für die Funktion mit deaktiviertem Domänen- und Szenenneuladen validiert sind. Bitte informieren Sie uns im Forum , wenn Sie auf Probleme stoßen!

So ändern Sie Ihre Skripte richtig, wenn Sie Domain Reload deaktiviert haben

Wie Sie sehen, lässt sich das Neuladen der Domain ganz einfach vermeiden, es hat jedoch seinen Preis. Sie müssen Anpassungen an statischen Feldern und statischen Ereignishandlern in Ihren Skripten vornehmen, um sicherzustellen, dass Ihre Skriptzustände beim Wechsel in den Wiedergabemodus korrekt zurückgesetzt werden.

Das folgende Codebeispiel enthält einen Zähler, der hochgeht, wenn der Spieler die Schaltfläche „Springen“ drückt. Wenn das Neuladen der Domain aktiviert ist, wird der Zähler beim Wechsel in den Wiedergabemodus automatisch auf Null zurückgesetzt. Nachdem Sie das Neuladen der Domain deaktiviert haben, wird der Zähler nicht zurückgesetzt; er behält seinen Wert im und außerhalb des Wiedergabemodus. Dies bedeutet, dass beim zweiten Durchlauf Ihres Projekts im Editor der Zähler möglicherweise nicht auf Null steht, wenn er sich beim vorherigen Durchlauf geändert hat.

öffentliche Klasse StaticCounterExample: MonoBehaviour
{
//dieser Zähler wird nicht auf Null zurückgesetzt, wenn das Neuladen der Domain deaktiviert ist
statischer Int-Zähler = 0;

//Update wird einmal pro Frame aufgerufen
void Update()
{
if (Input.GetButtonDown("Jump"))
{
Zähler++;
Debug.Log("Zähler: " + Zähler);
}
}
}

Verwenden Sie das Attribut [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.SubsystemRegistration)] und setzen Sie den Wert explizit zurück, um sicherzustellen, dass der Zähler korrekt zurückgesetzt wird, wenn das Neuladen der Domäne deaktiviert ist. Beispiel:

using UnityEngine;

öffentliche Klasse StaticCounterExampleFixed: MonoBehaviour
{
statischer Int-Zähler = 0;

[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.SubsystemRegistration)]
statisches void Init()
{
Debug.Log("Zähler zurückgesetzt.");
Zähler = 0;
}

//Update wird einmal pro Frame aufgerufen
void Update()
{
if (Input.GetButtonDown("Jump"))
{
Zähler++;
Debug.Log("Zähler: " + Zähler);
}
}
}

Nachdem Sie das Neuladen der Domänen deaktiviert haben, wird Unity beim Verlassen des Wiedergabemodus keine Methoden aus statischen Ereignishandlern mehr abmeldet. Dies kann zu Komplikationen führen, wenn Sie Code haben, der Methoden mit statischen Ereignishandlern registriert. Beispielsweise würden beim ersten Abspielen Ihres Projekts im Editor die Methoden wie gewohnt registriert. Beim zweiten Ausführen Ihres Projekts würden diese Methoden jedoch zusätzlich zum ersten Mal registriert und daher beim Auftreten des Ereignisses zweimal aufgerufen.

Der folgende Code registriert eine Methode beim statischen Eventhandler Application.quitting:

using UnityEngine;
öffentliche Klasse StaticEventExample: MonoBehaviour
{
void Start()
{
Debug.Log("Registriere die Beendigungsfunktion");
Anwendung.quitting += Beenden;
}

statisches void Quit()
{
Debug.Log("Beenden!");
}
}

Wenn das Neuladen der Domänen deaktiviert ist, fügt das obige Beispiel die Methode „Quit“ jedes Mal erneut hinzu, wenn Sie in den Wiedergabemodus wechseln. Dies führt jedes Mal, wenn Sie den Wiedergabemodus verlassen, zu einer zusätzlichen Meldung „Beenden“.

Verwenden Sie das Attribut [RuntimeInitializeOnLoadMethod] und melden Sie die Methode explizit ab, sodass sie nicht zweimal hinzugefügt wird:

using UnityEngine;
öffentliche Klasse StaticEventExampleFixed: MonoBehaviour
{
[RuntimeInitializeOnLoadMethod]
static void RunOnStart()
{
Debug.Log("Registrierung der Beenden-Funktion aufheben");
Application.quitting -= Beenden;
}

void Start()
{
Debug.Log("Registriere die Beendigungsfunktion");
Anwendung.quitting += Beenden;
}

statisches void Quit()
{
Debug.Log("Player beenden");
}
}

Weitere Einzelheiten zum Ändern Ihrer Skripts, damit sie ordnungsgemäß funktionieren, wenn die Domänenneuladung deaktiviert ist, finden Sie in unserer Dokumentation.

Asset Store

Wir möchten sicherstellen, dass beliebte Asset Store-Pakete mit deaktiviertem Domänen- und Szenen-Neuladen funktionieren. Sie können uns helfen, indem Sie den Herausgebern Ihrer Asset-Pakete alle Probleme melden, die bei Ihren Projekten auftreten.

Nehmen Sie an der Beta von Unity 2019.3 teil!

Wir sind davon überzeugt, dass diese Funktion den Wechsel Ihres Projekts in den Wiedergabemodus erheblich beschleunigen wird, wenn es derzeit nur langsam vorangeht. Nehmen Sie an der Beta von Unity 2019.3 teil und probieren Sie es aus. Wir freuen uns auf Ihre Meinung im Forum! Da es sich bei dieser Funktion um eine experimentelle Funktion handelt, können Sie uns dennoch dabei helfen, sie so zu gestalten, dass sie Ihren Anforderungen entspricht. Wir freuen uns besonders über Ihre Rückmeldungen zu den Problemen, auf die Sie stoßen.

Großer Dank geht an die Forum-Benutzer @Sini, @chrisk, @Peter77 und @Baste, die der gesamten Community bereits geholfen haben, indem sie diese Funktion getestet und wertvolles Feedback gegeben haben.