Bisakah saya menjalankan skrip pemuatan saya sendiri selama layar splash Unity?

10

Bisakah saya memuat data di latar belakang saat layar splash Unity naik? Jika ya, bagaimana caranya?

Saya mencoba menjalankan kode selama splash screen, bukan hanya memuat aset.

Saya belum dapat menemukan informasi tentang ini di Google atau Dokumentasi Persatuan .

Evorlor
sumber
2
Saya pikir Unity sudah memuat seluruh aplikasi Anda ketika layar splash terlihat. Saya tidak berpikir apa yang ingin Anda lakukan itu mungkin, tetapi saya akan salah kali ini.
Hellium
2
Ini terasa seperti masalah XY: mengapa Anda ingin memuat hal-hal selama layar itu?
doppelgreener
1
Apa pun yang Anda masukkan ke dalam adegan pertama gim Anda dimuat saat layar pembuka naik, kan? Jadi, apakah tidak cukup untuk memasukkan konten yang ingin Anda muat dalam adegan pertama (baik di luar kamera, dinonaktifkan, atau hanya direferensikan jika Anda tidak ingin konten itu segera terlihat)? Atau apakah Anda mencoba memuat konten dari sumber lain, seperti server web?
DMGregory
@ DMGregory Poin bagus. Saya memperbarui pertanyaan. Saya mencoba menjalankan kode.
Evorlor
Kami memahami Anda mencoba menjalankan kode (memuat skrip adalah kode) - tetapi kode apa dan mengapa? Anda punya masalah dan Anda memutuskan solusinya adalah menjalankan kode itu selama layar splash Unity; mengapa demikian?
doppelgreener

Jawaban:

9

Saya baru saja melakukan beberapa tes, dan saya menemukan bahwa konstruktor untuk objek dalam adegan pertama benar-benar dipanggil ketika layar splash masih ditampilkan.

Berikut adalah beberapa timing yang saya ukur dengan Stopwatch statis:

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

Jadi, sepertinya kita dapat memicu skrip untuk menjalankan hampir 3 detik sebelum akhir layar splash (dengan pengaturan default) dengan melepaskannya dari konstruktor. Anda dapat mencoba memicu kode memuat Anda (mungkin dengan utasnya sendiri) dari sana.

Berhati-hatilah karena ini mungkin dipanggil dari utas pemuatan, jadi karena kita tidak berada di utas utama, kita akan sedikit lebih terbatas dengan apa yang diperbolehkan untuk dilakukan di sini. Jika ada hal tertentu yang Anda coba lakukan yang tidak didukung pada utas pemuatan, pertimbangkan untuk memposting pertanyaan baru dengan detail aplikasi Anda dan kami dapat mencoba mencari solusi untuk kasus itu.

DMGregory
sumber
1
3 detik sebelum akhirnya, maksud Anda, satu detik sebelum memulai?
Yakub
Dalam percobaan saya, skrip saya mendapatkan Update()centang pertama 2,9 detik setelah konstruktor melepaskan. Hanya itu yang bisa saya pahami dengan instrumentasi saat ini.
DMGregory
2

Taruhan terbaik Anda adalah membuat layar memuat Anda sendiri dan mengaturnya sebagai adegan awal. Kemudian, dari adegan sederhana itu, gunakan Manajer Scene untuk memuat adegan berikutnya di latar belakang, secara tidak sinkron .

Saya tidak dapat menemukan informasi untuk mengonfirmasi ini, tetapi dari pengamatan saya, tampaknya Unity memuat adegan awal Anda saat layar splash ditampilkan.

Pada beberapa platform, permainan mulai berjalan sebelum layar splash hilang, jika memuat cukup cepat.

Semua ini dapat berubah kapan saja, di platform apa pun, pada pembaruan versi apa pun. Tidak ada jaminan bahwa ini akan konsisten, jadi Anda lebih baik menggunakan layar memuat Anda sendiri.

Stephane Hockenhull
sumber
Layar muat ganda adalah apa yang Anda sarankan?
Evorlor
Intinya ya. Ini cara untuk melakukannya dengan Unity. Pasang layar splash / loading untuk gim Anda atau animasi logo studio sambil memuat adegan berikutnya.
Stephane Hockenhull
1
@Evorlor inilah yang saya lakukan dengan permainan saya dan bekerja dengan sangat baik. Meskipun ini tidak memungkinkan Anda memanfaatkan waktu yang dibutuhkan Intro persatuan, karena intro itu bisa sangat singkat, Anda bisa membuat layar pemuatan (betapapun generiknya) dan menggunakannya untuk layar Anda.
John Hamilton
-1

Jawaban singkatnya adalah tidak , Anda tidak dapat melakukannya.

Kedua jawaban di atas benar dalam hal manajemen adegan. Anda dapat menggunakan Scene Manager untuk memuat adegan dan karena async Anda dapat menjalankan kode lain secara paralel.

Lihatlah dokumentasi SceneManager.LoadScene untuk lebih jelasnya.

Yang paling dekat Anda bisa menjalankan kode Anda secepat mungkin setelah permainan dimulai menjalankannya dari adegan pertama dengan jejak kecil. Sebut saja Splash Scene . Satu-satunya hal yang akan dikandungnya adalah gambar splash dan pengontrol Anda menjalankan kode yang diperlukan dan memuat adegan lain.

Karena memiliki footprint kecil, ini akan memuat sangat cepat dan dengan demikian membuat kode Anda berjalan hampir seketika. Anda kemudian dapat melakukan apa yang harus Anda lakukan, dan memuat Pemandangan Lain sesudahnya.

Hal lain yang dapat Anda coba adalah menghapus "splash screen" menghapus gambar yang ingin Anda tampilkan di sana. Ini akan menjadi sedikit lebih cepat karena tidak akan dimuat pada awalnya.

Jadi alirannya akan seperti ini:

  1. Layar splash (tidak ada gambar di sini, cukup hitam)
  2. Adegan splash (tapak kecil dengan kode awal dan pemuat adegan berikutnya)
  3. Intro scene (adegan intro biasa)
  4. .... (adegan lain seperti biasa)

Adegan yang lebih kecil lebih cepat akan dimuat. Anda dapat menggunakan sesuatu seperti pengontrol splash yang terpasang ke objek apa pun di layar Splash yang dimuat .

using UnityEngine;
using UnityEngine.SceneManagement;

public class SplashController: MonoBehaviour
{
    void Start()
    {

        // RunSomeSyncMethod();

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