Bem-vindo de volta a série de vídeos do projeto scavengers.
No vídeo anterior vimos como configurar
o projeto e demonstrar o jogo finalizado.
Neste vídeo vamos criar as animações
para o jogador e inimigos
baseado no sprite sheet fornecido
e também configurar os prefabs do jogador e dos inimigos.
Vamos criar uma nova scene
e vamos começar criando o prefab do jogador,
e também as animações que serão utilizadas.
Vamos clicar em Game Object - Create Empty
e vamos chamar esse Game Object de Player.
Na nossa pasta Sprites temos uma sprite sheet,
que já foi separado
em múltiplos sprites.
Para mais informações sobre sprite sheets e
sprites você pode ler a informação no link abaixo.
Neste caso vamos selecionar o
primeiro conjunto de frames,
que são a animação do jogador parado,
e eu fiz isso clicando no primeiro frame e depois
shift-click no último frame que eu quero.
Eu vou clicar nos sprites selecionados e arrastá-los
para o player prefab.
E agora vamos dar um nome para a animação,
vamos chamá-la de PlayerIdle,
esta é a animação que será executada quando
o jogador não está fazendo nada.
Vamos colocar a animação na pasta Animations.
Você irá notar que quando fizemos isso que dois components
foram adicionados ao game object, um sprite renderer,
que irá desenhar o sprite atual da animação.
E um animator que irá permitir que nós controlemos a execução da animação.
Quando arrastamos os frames, estes dois
componentes foram adicionados, a Unity pedir que salvemos
a animação, que foi salva na pasta Animations.
Também foi criado o que chamamdos de animator controller,
que irá nos permitir gerenciar qual
animação está sendo executada.
Vamos movê-lo para nossa pasta Animator Controllers
E iremos adicionar mais algumas animações ao player.
Vamos voltar aos sprites.
E agora irei selecionar
os dois frames da animação PlayerChop,
arraste-os para o player,
e vamos chamá-la de PlayerChop.
Vamos colocar esta animação na pasta Animations.
Agora perceba que quando fizemos isso, não foi adicionado
outro animator controller, ao invés disso
esta animação foi adicionada ao animator controller
que já existe no player.
Vamos repetir este processo para a animação PlayerHit.
E em seguida podemos verificar se está funcionando corretamente.
Como podemos ver, nosso player tem a animação quando está parado,
mas ela está um pouco rápida
o que vamos fazer é abrir
o animator controller referenciado clicando duas vezes nele,
selecionar o estado PlayerIdle
e vamos alterar a velocidade da animação para 0.5,
que é metade da velocidade normal da animação.
Perceba que as outras duas animações
foram adicionadas como estados,
e mais para a frente na série de vídeos iremos
ver como controlar a mudança
entre estes estados via script.
Vamos verificar agora.
Muito bem.
Com as animações para o player feitas
vamos agora aplicar
uma tag ao player, chamada Player.
A tag Player já está pré-criada em
todos os projetos da Unity, nós também acrescentamos
algumas tags adicionais, food, exit,
enemy e soda.
Fizemos isso clicando em Add Tag
e digitando os nomes nos campos.
Vamos configurar a tag Player
e vamos também configurar a layer.
Aqui temos as layers default,
e acrescentamos uma layer adicional chamada Blocking.
Esta é a layer onde todas
as colisões serão checadas
portanto vamos selecionar esta layer
para o player, e criamos ela da mesma maneira,
selecionando Add Jayer e digitando o nome.
Vamos selecionar a layer Blocking.
Vamos adicionar mais uma layer
relacionada ao jogador, ou seja
vamos configurar a layer para o sprite renderer.
Temos algumas layers pré-definidas,
A layer Floor, que será para o nosso cenário.
A layer Item que será renderizada na frente
do cenário, que será utilizada pela comida e pelo refrigerante.
E uma layer Units para o player e os inimigos.
Vamos associar a player a layer Units.
Depois vamos adicionar dois components
ao player, vamos adicionar um box collider 2D
e um rigidbody 2D.
O box collider 2D irá nos permitir
verificar colisões contra o player.
E o rigidbody 2D nos irá permitir
mover o player usando o sistema de física da Unity.
Vamos configurar o rigidbody 2D para Is Kinematic
já que não queremos o player voando
e quicando pelo cenário, nós apenas vamos movê-lo
no grid de espaços do nosso cenário.
E vamos controlar o movimento usando um script
e configurando como Is Kinematic.
Vamos tambem ajustar o tamanho do
nosso box collider 2D
fazendo com que ele fique um pouco menor para que o
player não colida acidentalmente com
objetos nos espaços adjacentes,
apenas quando tentarmos mover para um espaço
já ocupado por outro collider.
Há outros componentes que iremos adicionar ao
player conforme desenvolvemos ele, mas por enquanto este é um bom ponto de partida.
Agora vamos selecionar o player
e arrastá-lo para nossa pasta Prefabs para criar um prefab.
Com o prefab criado
podemos remover temporariamente o player da hierarquia
e agora vamos criar nosso primeiro inimigo.
Vamos clicar em Game Object - Create Empty
e vamos chamá-lo de Enemy1.
Vamos começar acrescentando animações ao Enemy1.
Vamos voltar para os sprites
shift-click nos frames da animação EnemyIdle
e arraste-os.
Vamos chamar de Enemy1Idle.
This is going to automatically add the components that
Automaticamente os componentes necessários
serão adicionados e iremos acrescentar os outros
frames de nossa animação.
Adicione a animação Attack.
Podemos verificar que as animações estão funcionando.
Aí esta.
Agora também vamos acrescentar um box collider e um rigidbody.
Também vamos configurar o rigidbody do Enemy
para Is Kinematic
e vamos configurar a tag Enemy
e configurar o Enemy para a layer Blocking.
Vamos também configurar o sorting layer do sprite renderer para Units.
Isto feito vamos arrastar o Enemy
para criar o prefab do primeiro inimigo.
Mas ao invés de apagar o inimigo nós vamos apenas
modificá-lo para criar o segundo inimigo.
Renomeie-o para Enemy2.
E vamos arrastar
os frames da animação Enemy2Idle.
E da animação Enemy2Attack.
Quando arrastamos a animação
para o inimigo criamos um novo animator controller.
Vamos movê-lo para a pasta Animator Controllers.
Agora vamos abrir o animator controller do Enemy1
e podemos ver que todas as
animações foram acrescentadas como estados.
Agora o que nós vamos fazer é
apagar os estados relativos ao Enemy2
para isso, fazemos shift-click em cada estado
e depois clicamos com o botão direto para apagar.
Agora a Unity vai perguntar se queremos apagar os assets selecionados
escolha "Delete"
E fizemos isso porque
Enemy1 e Enemy2 irão compartilhar
a mesma máquina de estados, pois ambos tem os mesmos dois estados
Idle e Attack.
O que vamos fazer agora é criar o que chamamos de
animator override controller,
que nos vai permitir utilizar a mesma máquina de estados
e o mesmo script para controle
mas executar animações diferentes
em cada um dos estados.
Então vamos selecionar
Create - Animator Override Controller.
Vamos chamar de Enemy2
E a primeira coisa que vamos fazer é especificar
qual controller vai ser afetado pelo override,
selecionamos o controller do Enemy1 e arrastá-lo.
E aqui estão as duas
animações originais que iremos executar,
Enemy1Idle e Enemy1Attack,
e nos vamos substituí-las por
Enemy2Attack
e Enemy2Idle.
E no Enemy2 iremos mudar
o animator controller para agora
utilizar o animator override controller.
Agora se executamos a cena.
Aí está.
Finalmente vamos arrastar Enemy2 para a pasta Prefabs
para criar um novo prefab.
Em seguida vamos apagar Enemy2 da hierarquia
e salvar a cena.
Vamos chamá-la de Main
e salvá-la na nossa pasta Scenes.
Agora que temos nossos prefabs básicos criados
para o Player e nossos inimigos
agora vamos criar os outros
prefabs, e vamos também criar o layout do nosso cenário.
No próximo vídeo vamos criar
os prefabs do chão, paredes, comida, refrigerante
e saída.