Criando instâncias

Na parte anterior, nós vimos que uma cena é uma coleção de nós organizados em uma estrutura de árvore, com um único nó como sua raiz. Você pode dividir seu projeto em qualquer número de cenas. Essa funcionalidade ajuda você a dividir e organizar os diferentes componentes do seu jogo.

Você pode criar quantas cenas você quiser e salvar elas para o disco com a extensão .tscn, que signfica "cena de texto". O arquivo ``Label.tscn``da lição anterior foi um exemplo. Nós chamamos esses arquivos de "Cenas Empacotadas" já que eles empacotam informação sobre o conteúdo da sua cena.

Aqui temos o exemplo de uma bola. Ele é composto de um nó RigidBody2D.

../../_images/instancing_ball_scene.png

Depois de salvar uma cena, ela funciona como um projeto: você pode reproduzi-la em outras cenas quantas vezes quiser. Replicar um objeto de um modelo como este é chamado de instanciamento.

../../_images/instancing_ball_instances_example.png

Como mencionamos na parte anterior, as cenas instanciadas se comportam como um nó: o editor oculta seu conteúdo por padrão. Quando você instancia a Bola, você vê apenas o nó Ball. Observe também como cada duplicata tem um nome exclusivo.

Cada instância da cena Ball começa com a mesma estrutura e propriedades que Ball.tscn. Porém, você pode modificar cada uma independentemente, tal como mudar como ela quica, o quão pesada ela é, ou qualquer propriedade exposta pela cena de origem.

Na prática

Vamos usar o instanciamento na prática para ver como funciona no Godot. Convidamos você a baixar o projeto de amostra da bola que preparamos para você: instancing.zip.

Extraia o arquivo em seu computador. Depois, abra o Godot e no gerenciador de projetos, clique no botão Importar para importar o projeto.

../../_images/instancing_import_button.png

No pop-up que aparecer, clique o botão explorar e navegue até a pasta que você extraiu.

../../_images/instancing_import_browse.png

Clique duas vezes no arquivo ``project.godot ` para abri-lo.

../../_images/instancing_import_project_file.png

Por fim, clique no botão Importar e Editar.

../../_images/instancing_import_and_edit_button.png

O projeto contém duas Cenas Empacotadas: Main.tscn, contendo paredes contra as quais a bola colide, e Ball.tscn. A cena principal deve abrir automaticamente.

../../_images/instancing_main_scene.png

Vamos adicionar uma bola como um filho do nó principal. No painel da Cena, selecione o nó Principal. Depois, clique no ícone de ligação na parte superior do painel da cena. Este botão permite-lhe adicionar uma instância de uma cena como filho do nó atualmente selecionado.

../../_images/instancing_scene_link_button.png

Clique duas vezes na cena da bola para instancia-la.

../../_images/instancing_instance_child_window.png

A bola vai aparecer no canto superior esquerdo da tela.

../../_images/instancing_ball_instanced.png

Clique nela e arraste-a para o centro da tela.

../../_images/instancing_ball_moved.png

Aperte F5 para jogar o jogo. Você deve vê-la cair.

Agora, queremos criar mais instâncias do nó Bola. Com a bola ainda selecionada, aperte Ctrl-D (Cmd-D no macOS) para chamar o comando duplicar. Clique e arraste para mover a nova bola para um local diferente.

../../_images/instancing_ball_duplicated.png

Você pode repetir esse processo até que você tenha várias bolas na cena.

../../_images/instancing_main_scene_with_balls.png

Jogue o jogo novamente. Agora você deve ver cada bola cair de forma independente uma da outra. Isso é o que instâncias fazem. Cama uma é uma reprodução independente de uma cena modelo.

Editando cenas e instâncias

Instâncias fazem mais do que isso. Com essa funcionalidade, você pode:

  1. Altere as propriedades de uma bola sem afetar as outras usando o Inspetor.

  2. Altere as propriedades padrão de cada Bola abrindo a cena Ball.tscn e fazendo uma alteração do nó Bola ali. Ao salvar, todas as instâncias da Bola no projeto terão seus valores atualizados.

Nota

Mudar uma propriedade em uma instância sempre terá prioridade sobre os valores da Cena Empacotada correspondente.

Vamos testar isso. Abra ``Ball.tscn``e selecione o nó Bola. No Inspetor à direita, clique na propriedade PhysicsMaterial para expandi-la.

../../_images/instancing_physics_material_expand.png

Defina sua propriedade Bounce como 2 clicando no campo numérico, digitando 2 e pressionando Enter.

../../_images/instancing_property_bounce_updated.png

Jogue o jogo pressionando F5 e observe como todas as bolas agora saltam muito mais. Como a cena Ball é um modelo para todas as instâncias, modificá-la e salvá-la faz com que todas as instâncias sejam atualizadas de acordo.

Agora vamos ajustar uma instância de forma individual. Clique na aba correspondente acima da janela de exibição para voltar para a cena Main.

../../_images/instancing_scene_tabs.png

Selecione um dos nós Ball instanciados e, no Inspetor, mude sua Escala de Gravidade para 10.

../../_images/instancing_property_gravity_scale.png

Um botão cinza de "reverter" aparecerá perto da propriedade ajustada.

../../_images/instancing_property_revert_icon.png

Este ícone indica que você está substituindo um valor da cena empacotada de origem. Mesmo que você modifique a propriedade na cena original, a substituição do valor será preservada na instância. Clicar no ícone de reversão restaurará a propriedade para o valor na cena salva.

Rode o jogo de novo e perceba que essa bola agora caí muito mais rápida que as outras.

Nota

Se você mudar um valor no PhysicsMaterial de uma instância, isso afetará todas as outras. Isso é porque PhysicsMaterial é um recurso, e recursos são compartilhados entre instâncias. Para fazer um recurso único para uma instância, clique nele com o botão direito no Inspetor e clique Tornar Único no menu contextual.

Recursos são outro bloco de construção essencial de jogos Godot que cobriremos em uma lição posterior.

Instâncias de cena como linguagem de design

Instâncias e cenas no Godot oferecem uma excelente linguagem de design, distinguindo a engine de outras. Concebemos o Godot em torno deste conceito desde o início.

Nós recomendamos ignorar padrões de código de arquitetura, tal como o Model-View-Control (MVC) ou diagramas Relação-Entidade, ao fazer jogos com Godot. Ao invés disso, você pode começar imaginando os elementos que jogadores verão em seu jogo e estruturar seu código ao redor deles.

Por exemplo, você pode dividir um jogo de tiro da seguinte forma:

../../_images/instancing_diagram_shooter.png

Você pode criar um diagrama assim para quase qualquer tipo de jogo. Cada retângulo representa uma entidade que é visível no jogo na perspectiva do jogador. As setas indicam qual cena possui qual.

Depois de ter um diagrama, recomendamos criar uma cena para cada elemento listado nele para desenvolver seu jogo. Você usará instanciamento, seja por código ou diretamente no editor, para construir sua árvore de cenas.

Os programadores tendem a gastar muito tempo projetando arquiteturas abstratas e tentando encaixar componentes nelas. O design baseado em cenas torna o desenvolvimento mais rápido e direto, permitindo que você se concentre na própria lógica do jogo. Como a maioria dos componentes do jogo é mapeada diretamente para uma cena, usar um design baseado em instanciamento de cenas significa que você precisará de muito menos código arquitetural.

Aqui está o exemplo de um diagrama de cena para um jogo de mundo aberto com muitos assets e elementos aninhados:

../../_images/instancing_diagram_open_world.png

Imagine que começamos criando a sala. Poderíamos fazer algumas cenas de salas diferentes, com arranjos únicos de móveis nelas. Mais tarde, poderíamos fazer uma cena de casa que usa várias instâncias de sala para o interior. Criaríamos uma cidadela a partir de muitas casas instanciadas e um grande terreno no qual colocaríamos a cidadela. Cada uma delas seria uma cena que instancia uma ou mais subcenas.

Mais tarde, poderíamos criar cenas representando guardas e adicioná-los à cidadela. Eles seriam adicionados indiretamente ao mundo geral do jogo.

Com Godot, é fácil iterar em seu jogo assim, pois tudo o que você precisa fazer é criar e instanciar mais cenas. Nós fizemos o editor ser mais acessível a programadores, designers e artistas. Um processo típico de desenvolvimento de equipe pode envolver artistas 2D ou 3D, designers de níveis, designers de jogos e animadores, todos trabalhando com o editor Godot.

Resumo

Instanciar, o processo de produzir um objeto a partir de um modelo tem muitos usos úteis. Com cenas, ele lhe dá:

  • A capacidade de dividir seu jogo em componentes reutilizáveis.

  • Uma ferramenta para estruturar e encapsular sistemas complexos.

  • Uma linguagem para pensar sobre a estrutura do seu projeto de jogo de uma forma natural.