Este artigo será útil para desenvolvedores de jogos iniciantes. Nele, falarei sobre minha própria experiência na implementação de interação em vários estágios e os problemas que encontrei.
Vamos falar sobre classes estáticas para armazenamento de dados, várias maneiras de carregar cenas com o mecanismo Unity e também abordar o caso de conectar o Admob ao projeto. Informações fornecidas pela documentação oficial e uma comunidade amigável de desenvolvedores.
A situação
Meu jogo consiste em duas cenas - o menu principal, que é visível imediatamente após o carregamento e, diretamente, uma cena do jogo com mecânica, na qual, dependendo da opção selecionada, a pré-fabricada do objeto é carregada. Não foi possível combiná-los em uma cena, pois vários objetos bastante complexos estão vinculados ao menu e é mais conveniente separar entidades.
Anteriormente, eu usaria apenas um determinado objeto controlador para armazenar os dados, mas com o descarregamento da cena, ele deixa de existir.
Transferência de dados (classe estática)
Aconteceu que o Unity é excelente no trabalho com código, mesmo que esteja pacificamente em um arquivo na pasta de scripts e não seja anexado por um componente a um objeto no palco (isso não era óbvio para iniciantes). Por exemplo, esse arquivo pode ser uma classe estática desse tipo:
using UnityEngine; public static class DataHolder { private static GameObject prefabName; public static GameObject Prefab { get { return prefabName; } set { prefabName = value; } } }
Assim, consegui salvar a escolha do usuário, mesmo após descarregar a cena e carregar uma nova. Inicialmente, tudo funcionou exatamente com cenas difíceis de trocar.
Usando esse mecanismo, você também pode transferir configurações para outras cenas no menu, por exemplo, o idioma de localização, configurações de sons e música e muito mais.
Múltiplos valores (SceneManagement)
Tudo me serviu, até que recebi a tarefa de me conectar ao projeto Admob (publicidade), para que o vídeo fosse mostrado logo no início da cena do jogo. Como se viu, existem sutilezas: solicitar um vídeo leva uma quantidade significativa de tempo e simplesmente não tem tempo para chegar ao trocar de cena. Eu não queria adiar atrasos adicionais no projeto, principalmente porque temos muito tempo até que o player "grude" no menu. Então eu descobri que não há necessidade de mudar as cenas de maneira "difícil", porque há uma opção maravilhosa para carregamento aditivo (sem descarregar a cena anterior).
Carrego a cena do jogo com o controlador de menu (a cena com o menu e o objeto de anúncio também permanece carregada):
SceneManager.LoadScene(1,LoadSceneMode.Additive);
Após a conclusão do nível, descarrego a cena do jogo com o controlador do jogo (para que não fique travado na minha memória):
SceneManager.LoadScene(0,LoadSceneMode.Single);
Usando esse esquema, a publicidade é carregada imediatamente no início do aplicativo e você pode chamar a exibição do comercial a qualquer momento desejado. Você pode fazer o mesmo com qualquer objeto que precisar.
Os problemas
Infelizmente, mesmo com o carregamento adicional de cenas, você não poderá se aprofundar nos objetos de uma cena a partir da outra. Os links para objetos terão que ser transmitidos através de um certo "mediador" (no meu caso, a mesma classe estática foi usada).
Tenha cuidado ao instanciar pré-fabricados, se várias cenas estiverem ativas - para mim todas elas decidiram colidir com a cena errada (mais sobre isso outra vez).