Instâncias

Introdução

Criar uma única cena e adicionar nós a ela pode funcionar para projetos pequenos, mas, à medida que o projeto cresce em tamanho e complexidade, a quantidade de nós pode se tornar impraticável rapidamente. Para resolver isso, Godot permite que um projeto seja separado em qualquer quantidade de cenas. Isso é uma ferramenta poderosa que lhe ajuda a organizar os diferentes componentes do seu jogo.

Em Cenas e nós, você aprendeu que uma cena é uma coleção de nós organizados em uma estrutura de árvore, com um único nó como nó raiz.

../../_images/tree.png

Você pode criar quantas cenas quiser e salvá-las no disco. Cenas salvas assim são chamadas de “Cenas Empacotadas” e têm a extensão de arquivo .tscn.

../../_images/instancingpre.png

Uma vez salva, a cena pode ser instanciada dentro de outra como se fosse qualquer outro nó.

../../_images/instancing.png

Na figura acima, a Cena B foi adicionada à Cena A como uma instância.

Instanciando em exemplo

Para aprender como funcionam as instâncias, vamos começar baixando um projeto de exemplo: instancing.zip.

Descompacte o projeto onde quiser. Depois, abra o Godot e adicione esse projeto no gerenciador de projetos usando o botão “Import”:

../../_images/instancing_import.png

Navegue para a pasta onde extraiu e abra o arquivo “project.godot” que está dentro dela. Depois de fazer isso, o novo projeto irá aparecer na lista de projetos. Edite-o pressionado o botão “Editar”.

Este projeto contém duas cenas: “Ball.tscn” (bola) e “Main.tscn” (principal). A cena da bola usa um RigidBody2D para fornecer um comportamento de física, enquanto a cena principal tem um conjunto de obstáculos com os quais a bola colide (usando StaticBody2D).

../../_images/instancing_ballscene.png ../../_images/instancing_mainscene.png

Abra a cena Main e selecione o nó raiz:

../../_images/instancing_mainroot.png

Queremos adicionar uma instância da cena Ball como filha da Main. Clique no botão com formato de elo (o texto de dica diz “Instanciar um arquivo de cena como Nó[…]” e selecione o arquivo Ball.tscn.

../../_images/instancing_linkbutton.png

A bola será colocada no canto superior esquerdo da área da tela (isto é (0, 0) nas coordenadas da cena). Clique e arraste a bola para algum lugar perto da parte superior central da cena:

../../_images/instancing_placeball.png

Pressione “Rodar” e veja a bola cair para parte de baixo da tela:

../../_images/instancing_playbutton.png

Múltiplas Instâncias

Você pode adicionar quantas instâncias quiser a uma cena, seja usando o botão “Instância” de novo, seja clicando na instância da bola e pressionando “Duplicar” (Ctrl-D):

../../_images/instancing_multiball.png

Execute a cena de novo e todas as bolas cairão.

../../_images/instancing_multiball.gif

Editando instâncias

Abra a cena Bola e adicione um PhysicsMaterial clicando na seta baixo e selecionando “Novo PhysicsMaterial”.

../../_images/instancing_physicsmat1.png

Então, expanda o material clicando-o, e defina a propriedade Bounce para 1.

../../_images/instancing_physicsmat2.png

Pressione “Rodar” e note que todas as bolas instanciadas agora quicam muito mais. Já que as bolas são baseadas na cena salva, alterações nessa cena afetam todas as instâncias.

You can also adjust individual instances. Set the bounce value back to 0 and then in the Main scene, select one of the instanced balls. Resources like PhysicsMaterial are shared between instances by default, so we need to make it unique. Click on the down arrow and select “Make Unique”. Set its Bounce to 1 and press “Play”.

../../_images/instancing_property.png

Note que o botão cinza “reverter” aparece ao lado da propriedade ajustada. Quando este botão está presente, significa que você modificou uma propriedade na cena instanciada para sobrepor o valor da cena salva. Mesmo se essa propriedade for modificada na cena original, o valor personalizado permanecerá o mesmo. Pressionando o botão reverter vai restaurar a propriedade para o valor na cena salva.

Conclusão

Instâncias podem ser úteis quando você quer criar muitas cópias do mesmo objeto. Também é possível criar instâncias em código usando GDScript, veja Instâncias (continuação).