Kann ich während des Unity-Begrüßungsbildschirms mein eigenes Ladeskript ausführen?

10

Kann ich Daten im Hintergrund laden, während der Unity-Begrüßungsbildschirm geöffnet ist? Wenn das so ist, wie?

Ich versuche, Code während des Begrüßungsbildschirms auszuführen und nicht nur Assets zu laden.

Ich konnte keine Informationen dazu in Google oder der Unity-Dokumentation finden .

Evorlor
quelle
2
Ich denke, Unity lädt bereits Ihre gesamte Anwendung, wenn der Begrüßungsbildschirm sichtbar ist. Ich denke nicht, dass das, was Sie tun möchten, möglich ist, aber ich würde mich diesmal gerne irren.
Hellium
2
Das fühlt sich wie ein XY-Problem an: Warum möchten Sie während dieses Bildschirms etwas laden?
Doppelgreener
1
Alles, was Sie in die erste Szene Ihres Spiels eingefügt haben, wird geladen, während der Begrüßungsbildschirm aktiv ist, oder? Wäre es also nicht ausreichend, den Inhalt, den Sie laden möchten, in diese erste Szene aufzunehmen (entweder außerhalb der Kamera, deaktiviert oder nur referenziert, wenn dieser Inhalt nicht sofort sichtbar sein soll)? Oder versuchen Sie, Inhalte von einer anderen Quelle wie einem Webserver zu laden?
DMGregory
@ DMGregory Großartiger Punkt. Ich habe die Frage aktualisiert. Ich versuche, Code auszuführen.
Evorlor
Wir verstehen, dass Sie versuchen, Code auszuführen (Ladeskripte sind notwendigerweise Code) - aber welcher Code und warum? Sie haben ein Problem und haben entschieden, dass die Lösung darin besteht, diesen Code während des Unity-Begrüßungsbildschirms auszuführen. Warum das?
Doppelgreener

Antworten:

9

Ich habe gerade einige Tests durchgeführt und festgestellt, dass der Konstruktor für Objekte in der ersten Szene tatsächlich aufgerufen wird, während der Begrüßungsbildschirm noch angezeigt wird.

Hier sind einige Timings, die ich mit einer statischen Stoppuhr gemessen habe:

Constructed  0     s
Awake        2.118 s
OnEnable     2.12  s
Start        2.744 s
First Update 2.919 s

Es sieht also so aus, als könnten wir ein Skript auslösen, das fast 3 Sekunden vor dem Ende des Begrüßungsbildschirms (mit Standardeinstellungen) ausgeführt wird, indem wir es vom Konstruktor aus starten. Sie können von dort aus versuchen, Ihren Ladecode (möglicherweise in einem eigenen Thread) auszulösen.

Beachten Sie nur, dass dies wahrscheinlich vom Ladethread aufgerufen wird. Da wir uns also nicht im Hauptthread befinden, sind wir etwas eingeschränkter in Bezug auf das, was wir hier tun dürfen. Wenn Sie eine bestimmte Aufgabe ausführen möchten, die im Ladethread nicht unterstützt wird, sollten Sie eine neue Frage mit Details zu Ihrer Anwendung veröffentlichen. Wir können dann versuchen, eine Problemumgehung für diesen Fall zu finden.

DMGregory
quelle
1
3 Sekunden vor dem Ende, eine Sekunde vor dem Start?
Jacob
In meinen Experimenten erhält mein Skript seinen ersten Update()Tick ​​2,9 Sekunden nach dem Auslösen des Konstruktors. Das ist ungefähr alles, was ich mit der aktuellen Instrumentierung erkennen kann.
DMGregory
2

Am besten erstellen Sie Ihren eigenen Ladebildschirm und legen diesen als erste Szene fest. Verwenden Sie dann aus dieser einfachen Szene den Szenenmanager , um die nächste Szene asynchron im Hintergrund zu laden .

Ich kann keine Informationen finden, um dies zu bestätigen, aber meiner Beobachtung nach scheint Unity Ihre erste Szene zu laden, während der Begrüßungsbildschirm angezeigt wird.

Auf einigen Plattformen wird das Spiel gestartet, bevor der Begrüßungsbildschirm ausgeblendet wird, wenn das Laden schnell genug ist.

All dies kann sich jederzeit, auf jeder Plattform und bei jedem Versionsupdate ändern. Es gibt keine Garantie dafür, dass dies konsistent ist. Verwenden Sie daher besser Ihren eigenen Ladebildschirm.

Stephane Hockenhull
quelle
Doppelte Ladebildschirme schlagen Sie vor?
Evorlor
Im Wesentlichen ja. So geht das mit Unity. Platzieren Sie einen Begrüßungs- / Ladebildschirm für Ihr Spiel oder eine Studio-Logo-Animation, während die nächste Szene geladen wird.
Stephane Hockenhull
1
@Evorlor das mache ich mit meinem Spiel und funktioniert einwandfrei. Obwohl Sie dadurch nicht die Zeit nutzen können, die das Unity-Intro benötigt, können Sie, da dieses Intro ziemlich kurz sein kann, einfach einen Ladebildschirm (wie allgemein auch immer) erstellen und diesen für Ihren verwenden.
John Hamilton
-1

Kurze Antwort ist nein , das können Sie nicht.

Beide obigen Antworten sind in Bezug auf das Szenenmanagement korrekt. Sie können den Szenenmanager verwenden , um die Szene zu laden, und da sie asynchron ist, können Sie anderen Code parallel ausführen.

Weitere Informationen finden Sie in der Dokumentation zu SceneManager.LoadScene .

Das Beste, was Sie tun können, um Ihren Code nach Spielbeginn so schnell wie möglich auszuführen, ist, ihn ab der ersten Szene mit geringem Platzbedarf auszuführen. Nennen wir es Splash Scene . Das einzige, was es enthalten würde, ist, dass Ihr Splash-Image und Ihr Controller den erforderlichen Code ausführen und eine andere Szene laden.

Da es nur einen geringen Platzbedarf hat, wird es sehr schnell geladen und Ihr Code wird fast sofort ausgeführt. Sie können dann tun, was Sie tun müssen, und anschließend eine andere Szene laden .

Sie können auch versuchen, "Begrüßungsbildschirm" zu entfernen, um alle Bilder zu entfernen, die Sie dort anzeigen möchten. Es wird nur ein bisschen schneller sein, da es zunächst nicht geladen wird.

Der Fluss wäre also ungefähr so:

  1. Begrüßungsbildschirm (kein Bild hier, nur schwarz machen)
  2. Splash-Szene (kleiner Platzbedarf mit Ihrem Anfangscode und dem nächsten Szenenlader)
  3. Intro-Szene (reguläre Intro-Szene)
  4. .... (andere Szenen wie gewohnt)

Je kleiner die Szene ist, desto schneller wird sie geladen. Sie können so etwas wie einen Splash-Controller verwenden, der an ein beliebiges Objekt im geladenen Splash-Bildschirm angehängt ist .

using UnityEngine;
using UnityEngine.SceneManagement;

public class SplashController: MonoBehaviour
{
    void Start()
    {

        // RunSomeSyncMethod();

        SceneManager.LoadScene("OtherSceneName", LoadSceneMode.Additive);
    }
}
IndieForger
quelle