Posso executar meu próprio script de carregamento durante a tela inicial do Unity?

10

Posso carregar dados em segundo plano enquanto a tela inicial do Unity está ativada? Se sim, como?

Estou tentando executar o código durante a tela inicial, não apenas carregar ativos.

Não consegui encontrar nenhuma informação sobre isso no Google ou na documentação da Unity .

Evorlor
fonte
2
Acho que o Unity já está carregando seu aplicativo inteiro quando a tela inicial está visível. Não acho que o que você queira fazer seja possível, mas adoraria estar errado desta vez.
Hellium 9/11/16
2
Parece um problema XY: por que você deseja carregar coisas durante essa tela?
Doppelgreener
1
Tudo o que você coloca na primeira cena do seu jogo é carregado enquanto a tela inicial está aberta, certo? Portanto, não seria suficiente incluir o conteúdo que você deseja carregar nessa primeira cena (fora da câmera, desativada ou apenas referenciada se você não quiser que esse conteúdo seja visível imediatamente)? Ou você está tentando carregar conteúdo de outra fonte, como um servidor web?
DMGregory
@DMGregory Ótimo ponto. Eu atualizei a pergunta. Estou tentando executar código.
Evorlor 21/05
Entendemos que você está tentando executar código (carregar scripts é necessariamente código) - mas qual código e por quê? Você tem um problema e decidiu que a solução é executar esse código durante a tela inicial do Unity; por que é que?
Doppelgreener 28/05

Respostas:

9

Acabei de fazer alguns testes e descobri que o construtor de objetos na primeira cena é chamado enquanto a tela inicial ainda é exibida.

Aqui estão alguns horários que eu medi com um cronômetro estático:

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

Portanto, parece que podemos acionar um script para ser executado quase 3 segundos antes do final da tela inicial (com configurações padrão) acionando-o do construtor. Você pode tentar acionar seu código de carregamento (possivelmente em seu próprio segmento) a partir daí.

Apenas lembre-se de que isso provavelmente está sendo chamado a partir do thread de carregamento, portanto, como não estamos no thread principal, ficaremos um pouco mais limitados com o que podemos fazer aqui. Se há algo específico que você está tentando fazer que não é suportado no encadeamento de carregamento, considere postar uma nova pergunta com detalhes de seu aplicativo e podemos tentar encontrar uma solução alternativa para esse caso.

DMGregory
fonte
1
3 segundos antes do fim, quer dizer, um segundo antes do início?
22617 Jacob
Nas minhas experiências, meu script recebe seu primeiro Update()visto 2,9 segundos após o construtor ser acionado. É tudo o que consigo discernir com a instrumentação atual.
DMGregory
2

Sua melhor aposta é criar sua própria tela de carregamento e definir isso como a cena inicial. Em seguida, a partir dessa cena simples, use o Scene Manager para carregar a próxima cena em segundo plano, de forma assíncrona .

Não consigo encontrar informações para confirmar isso, mas, pela minha observação, parece que o Unity está carregando sua cena inicial enquanto a tela inicial é exibida.

Em algumas plataformas, o jogo começa a rodar antes da tela inicial desaparecer, se o carregamento for rápido o suficiente.

Tudo isso pode mudar a qualquer momento, em qualquer plataforma, em qualquer atualização de versão. Não há garantia de que isso seja consistente, portanto é melhor usar sua própria tela de carregamento.

Stephane Hockenhull
fonte
Telas de carregamento duplo é o que você está sugerindo?
Evorlor
Essencialmente sim. É a maneira de fazer isso com o Unity. Coloque uma tela inicial / de carregamento para o seu jogo ou alguma animação do logotipo do estúdio enquanto ele carrega a próxima cena.
Stephane Hockenhull
1
@Evorlor é isso que faço no meu jogo e funciona perfeitamente bem. Embora isso não permita que você utilize o tempo que a introdução do Unity leva, uma vez que essa introdução pode ser bem curta, você pode criar uma tela de carregamento (por mais genérica) e usá-la para a sua.
John Hamilton
-1

Resposta curta é não , você não pode fazer isso.

Ambas as respostas acima estão corretas em termos de gerenciamento de cenas. Você pode usar o Scene Manager para carregar a cena e, como é assíncrona, pode executar outro código em paralelo.

Consulte a documentação do SceneManager.LoadScene para obter mais detalhes.

O mais próximo que você pode conseguir de executar o seu código o mais rápido possível após o início do jogo é executá-lo desde a primeira cena com uma pegada minúscula. Vamos chamá-lo de cena inicial . A única coisa que ele conteria é sua imagem inicial e controlador executando o código necessário e carregando outra cena.

Como possui uma área de ocupação reduzida, ele carrega muito rápido e, portanto, faz com que seu código seja executado quase instantaneamente. Você pode fazer o que tem que fazer e carregar outra cena depois.

Outra coisa que você pode tentar é remover a "tela inicial", remover as imagens que você deseja exibir lá. Será um pouco mais rápido, pois não será carregado inicialmente.

Portanto, o fluxo seria algo como isto:

  1. Tela inicial (sem imagem aqui, apenas deixe-a preta)
  2. Cena inicial (tamanho reduzido com o seu código inicial e o próximo carregador de cena)
  3. Cena de introdução (cena de introdução regular)
  4. .... (outras cenas, como de costume)

Quanto menor a cena, mais rápido será o carregamento. Você pode usar algo como o controlador de respingo anexado a qualquer objeto na tela inicial carregada .

using UnityEngine;
using UnityEngine.SceneManagement;

public class SplashController: MonoBehaviour
{
    void Start()
    {

        // RunSomeSyncMethod();

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