Transferência de dados entre cenas no Unity - aplicando valores múltiplos ao desenvolvimento de jogos simples

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).

Source: https://habr.com/ru/post/pt440718/


All Articles