Czy mogę uruchomić własny skrypt ładujący podczas ekranu powitalnego Unity?

10

Czy mogę ładować dane w tle, gdy ekran powitalny Unity jest włączony? Jeśli tak to jak?

Próbuję uruchomić kod podczas ekranu powitalnego, a nie tylko ładować zasoby.

Nie udało mi się znaleźć żadnych informacji na ten temat w Google ani w dokumentacji Unity .

Evorlor
źródło
2
Myślę, że Unity już ładuje całą twoją aplikację, gdy widoczny jest ekran powitalny. Nie sądzę, że to, co chcesz zrobić, jest możliwe, ale tym razem chciałbym się mylić.
Hellium,
2
To trochę problem XY: dlaczego chcesz ładować rzeczy podczas tego ekranu?
doppelgreener
1
Wszystko, co umieścisz w pierwszej scenie gry, jest ładowane, gdy ekran powitalny jest włączony, prawda? Czy zatem nie wystarczy zawrzeć w pierwszej scenie treści, które chcesz załadować (poza kamerą, wyłączone lub po prostu przywoływane, jeśli nie chcesz, aby te treści były natychmiast widoczne)? A może próbujesz załadować zawartość z innego źródła, na przykład z serwera WWW?
DMGregory
@DMGregory Świetny punkt. Zaktualizowałem pytanie. Próbuję uruchomić kod.
Evorlor,
Rozumiemy, że próbujesz uruchomić kod (ładowanie skryptów to koniecznie kod) - ale jaki kod i dlaczego? Masz problem i zdecydowałeś, że rozwiązaniem jest uruchomienie tego kodu na ekranie powitalnym Unity; dlaczego?
doppelgreener

Odpowiedzi:

9

Właśnie wykonałem kilka testów i odkryłem, że konstruktor obiektów w pierwszej scenie jest wywoływany, gdy ekran powitalny jest nadal wyświetlany.

Oto niektóre czasy, które zmierzyłem za pomocą statycznego stopera:

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

Wygląda więc na to, że możemy uruchomić skrypt, aby działał prawie 3 sekundy przed końcem ekranu powitalnego (z ustawieniami domyślnymi), uruchamiając go z konstruktora. Możesz spróbować uruchomić kod ładowania (być może w jego własnym wątku).

Tylko uważaj, że prawdopodobnie jest to wywoływane z wątku ładującego, więc ponieważ nie jesteśmy w głównym wątku, będziemy nieco bardziej ograniczeni tym, co wolno nam tutaj robić. Jeśli próbujesz wykonać konkretną czynność, która nie jest obsługiwana w wątku ładującym, rozważ opublikowanie nowego pytania zawierającego szczegółowe informacje o aplikacji, a my możemy spróbować znaleźć rozwiązanie tego problemu.

DMGregory
źródło
1
3 sekundy przed końcem, masz na myśli sekundę przed startem?
Jakub
W moich eksperymentach mój skrypt otrzymuje pierwsze Update()tyknięcie 2,9 sekundy po uruchomieniu konstruktora. To wszystko, co mogę rozpoznać przy obecnym oprzyrządowaniu.
DMGregory
2

Najlepiej jest stworzyć własny ekran ładowania i ustawić go jako scenę początkową. Następnie z tej prostej sceny użyj Menedżera scen, aby załadować następną scenę asynchronicznie w tle .

Nie mogę znaleźć informacji, aby to potwierdzić, ale z moich obserwacji wynika, że ​​Unity ładuje twoją początkową scenę podczas wyświetlania ekranu powitalnego.

Na niektórych platformach gra zaczyna działać, zanim zniknie ekran powitalny, jeśli ładowanie jest wystarczająco szybkie.

Wszystko to można zmienić w dowolnym momencie, na dowolnej platformie, w dowolnej aktualizacji wersji. Nie ma gwarancji, że będzie to spójne, więc lepiej jest użyć własnego ekranu ładowania.

Stephane Hockenhull
źródło
Sugerujesz ekrany z podwójnym ładowaniem?
Evorlor,
Zasadniczo tak. To sposób na zrobienie tego z Unity. Umieść ekran powitalny / wczytywania gry lub animację z logo studia podczas ładowania następnej sceny.
Stephane Hockenhull
1
@Evorlor to właśnie robię z moją grą i działa doskonale. Chociaż nie pozwala to wykorzystać czasu, jaki zajmuje wprowadzenie Unity, ponieważ może ono być dość krótkie, możesz po prostu zrobić ekran ładowania (jakkolwiek ogólny) i użyć go dla swojego.
John Hamilton,
-1

Krótka odpowiedź brzmi nie , nie możesz tego zrobić.

Obie powyższe odpowiedzi są poprawne pod względem zarządzania sceną. Możesz użyć programu Scene Manager załadowania sceny scen, a ponieważ jest ona asynchroniczna, można równolegle uruchamiać inny kod.

Spójrz na SceneManager.LoadScene dokumentację po więcej szczegółów.

Abyś mógł uruchomić kod tak szybko, jak to możliwe po uruchomieniu gry, uruchom go od pierwszej sceny z niewielkim śladem. Nazwijmy to Sceną Splash . Jedyne, co zawiera, to obraz powitalny i kontroler uruchamiający potrzebny kod i ładujący inną scenę.

Ponieważ ma mały rozmiar, ładuje się bardzo szybko, dzięki czemu kod działa prawie natychmiast. Następnie możesz zrobić to, co musisz, a następnie załadować Inną scenę .

Inną rzeczą, którą możesz wypróbować, jest usunięcie „ekranu powitalnego” i usunięcie wszystkich obrazów, które chcesz tam wyświetlić. Będzie tylko trochę szybszy, ponieważ początkowo nie zostanie załadowany.

Tak więc przepływ byłby mniej więcej taki:

  1. Ekran powitalny (brak obrazu, po prostu zrób czarny)
  2. Scena powitalna (mały ślad z początkowym kodem i modułem ładującym następną scenę)
  3. Scena wprowadzająca (zwykła scena wprowadzająca)
  4. .... (inne sceny jak zwykle)

Im mniejsza scena, tym szybciej się ładuje. Możesz użyć czegoś takiego jak kontroler powitalny dołączony do dowolnego obiektu w załadowanym ekranie powitalnym .

using UnityEngine;
using UnityEngine.SceneManagement;

public class SplashController: MonoBehaviour
{
    void Start()
    {

        // RunSomeSyncMethod();

        SceneManager.LoadScene("OtherSceneName", LoadSceneMode.Additive);
    }
}
IndieForger
źródło