[TUTORIAL] Criando Plants Vs Zombies - parte 2
2 participantes
Página 1 de 1
[TUTORIAL] Criando Plants Vs Zombies - parte 2
![[TUTORIAL] Criando Plants Vs Zombies - parte 2 866c6790c7ffa6d5e6ad895d460af7cf](https://3.bp.blogspot.com/-hlitklWK8-Q/Wv2cWMdg4KI/AAAAAAAAGvM/u5G_TOMfZQ8eyUgjpT4lhYqQ4axgm3WlwCLcBGAs/s200/866c6790c7ffa6d5e6ad895d460af7cf.png)
Clique aqui para ver a parte 1 do tutorial!
Olá, como vão? Nessa segunda parte do tutorial nós iremos desenvolver o nosso zombie do projeto, o inimigo principal do jogo original, então vamos lá?
Iniciando:
Primeiramente traga o sprite do zombie para a cena (através de "Assets" >> "Sprites PvZ >> Zombies) e coloque o nome desse objeto de "Zombie", agora na janela de assets na pasta de sprites, selecione todos os sprites do zombie (CTRL+A) e vamos aumentar sua resolução na Unity, mudando seus pixels de 100 para 70:
![[TUTORIAL] Criando Plants Vs Zombies - parte 2 Untitled%2B1](https://3.bp.blogspot.com/-DXV9cAzxC2M/Ww702IxRtpI/AAAAAAAAG2g/cAXn0F7tas0QbBGVzP6G1HTxCPn6oFTZACLcBGAs/s1600/Untitled%2B1.png)
Aplique a alteração.
Agora volte ao sprite em cena e nele adicione um Rigidbody2D (deixe a escala de gravidade em 0).
Adicione também um box collider2D com a opção "IsTrigger" marcada, e ajeite a colisão de forma que seja da cintura para baixo, desconsiderando a cabeça, já que ela vai ficar em outra parte da grama (o zombie ocupa duas gramas ao mesmo tempo) e para não ser detectado em ambas, sua colisão só ocorre da cintura para baixo:
![[TUTORIAL] Criando Plants Vs Zombies - parte 2 Untitled%2B6](https://3.bp.blogspot.com/-7Z4GKpsd-YE/Ww74EKg1O_I/AAAAAAAAG3M/_MYvSVGk5E49poo7oKdblrbjbj0y7n9sgCLcBGAs/s1600/Untitled%2B6.png)
Dando CTRL+6 você poderá criar as animações para o objeto.
Para adicionar a animação, crie uma nova com o nome de "ZombieWalking" e traga com o CTRL+A todos os sprites da pasta, deixando o "Samples" em 10:
![[TUTORIAL] Criando Plants Vs Zombies - parte 2 Untitled%2B2](https://2.bp.blogspot.com/-Au9R31vwzCE/Ww71m5musBI/AAAAAAAAG2o/s00EhQ9xq_w3iHLDJlhPOKIkSo7qdOWTACLcBGAs/s640/Untitled%2B2.png)
Agora crie uma nova animação com o nome de "ZombieAttack" e adicione os sprites da imagem abaixo (para fazer a animação do Zombie comendo):
![[TUTORIAL] Criando Plants Vs Zombies - parte 2 Untitled%2B3](https://1.bp.blogspot.com/-03U2BfCiHRw/Ww72FPLYqGI/AAAAAAAAG2w/NbcdyyKs57UQv7_UjiJPVQfnA7OOeAcnACLcBGAs/s640/Untitled%2B3.png)
Como não temos as animações do Zombie comendo vamos improvisar!
Deixe o "Samples" em 10 também e feche essa janela.
Agora abra o Animator desse objeto e vamos fazer as transições de animações.
Crie um parâmetro booleano com o nome de "isEating":
![[TUTORIAL] Criando Plants Vs Zombies - parte 2 Untitled%2B4](https://1.bp.blogspot.com/-ZePTljVC2LY/Ww72nsu6lpI/AAAAAAAAG28/Xn26SPE3_NoLrlG60RNHKAxJWn_8Mum9QCLcBGAs/s1600/Untitled%2B4.png)
Agora faça a transição de "ZombieWalking" para "ZombieAttack" com a condição do parâmetro "isEating" em true (não se esqueça de desmarcar a opção "Has Exit Time").
Faça o mesmo caminho de retorno de "ZombieAttack" para "ZombieWalking" só que agora com a condição "isEating" em false:
![[TUTORIAL] Criando Plants Vs Zombies - parte 2 Untitled%2B5](https://3.bp.blogspot.com/-jFEvdZeUl94/Ww73XR04R8I/AAAAAAAAG3E/Ui2L_zMqVm4pWIqWYy2KSpvOB_snC8gxQCLcBGAs/s640/Untitled%2B5.png)
Feche essa janela porque as animações estão configuradas corretamente agora.
Adicione um AudioSource no zombie e nele coloque o áudio "Eating" que é do zombie comendo, e desmarque a opção "Play on Awake" e marque a opção "Loop":
![[TUTORIAL] Criando Plants Vs Zombies - parte 2 Untitled%2B7](https://3.bp.blogspot.com/-BgbztHWaiYQ/Ww75CKm2zeI/AAAAAAAAG3Y/GgYzwNHg2cotFQwZVY--PPVVL5UbmsLeACLcBGAs/s320/Untitled%2B7.png)
Todos os componentes do zombie estão aplicados devidamente a ele, falta-nos o seu script:
Movimentando o Zombie:
Agora vamos até a pasta "Scripts" criaremos um C# script chamado "ZombieScript" para esse objeto.
O zombie no jogo possui 3 comportamentos distintos: Andar, comer a planta e morrer, portanto, podemos desenvolver esses três comportamentos nesse mesmo script.
Vamos iniciar com a criação das variáveis: Crie duas variáveis públicas do tipo "float" uma chamada "vel" que vai controlar a velocidade do zombie, e a outra chamada "zombieLife" que vai controlar a sua vida.
Também crie duas variáveis booleanas privadas: Uma chamada "canWalk" que vai gerenciar quando o zombie vai poder andar e uma chamada "canHit" que vai controlar quando ele vai poder comer a planta.
Também vamos precisar de uma variável do tipo "int" chamada "layer" para podermos controlar o layer das plantas na hora da detecção das mesmas, e variáveis do tipo "Rigidbody2D", "Animator" e "AudioSource" para controlar tais componentes.
Dentro do método Start faça com que canHit receba true, "layer" receba o layer chamado "Plants" e com que as variáveis de componentes "AudioSource" e etc recebam seus respectivos componentes:
![[TUTORIAL] Criando Plants Vs Zombies - parte 2 Untitled%2B9](https://4.bp.blogspot.com/-8ABb3FMc8yk/Ww77KNJT92I/AAAAAAAAG3k/FVPsdrJ1vgAT8oqu_h8vIL5ihBlYmf0OQCLcBGAs/s1600/Untitled%2B9.png)
Vá até a pasta "Prefabs", selecione as quatro plantas e crie um novo layer chamado "Plants" e coloque-as nesse layer:
![[TUTORIAL] Criando Plants Vs Zombies - parte 2 Untitled%2B10](https://4.bp.blogspot.com/--EBGUZ98U_Q/Ww77kgiuHOI/AAAAAAAAG3s/QNTHO88Rb_AD691Fvutctl4NvJsOvy6ZgCLcBGAs/s1600/Untitled%2B10.png)
Volte ao script do Zombie.
Defina o método "FixedUpdate" e dentro dela iremos gerenciar se o zombie pode andar ou não.
Caso a variável "canWalk" estiver true, nós iremos adicionar uma velocidade ao seu corpo rígido no eixo X, essa velocidade seria a variável "vel" multiplicada por Time.deltaTime, e caso essa variável estiver false, iremos fazer com que a velocidade volte a ficar zero nos dois eixos (o zombie parará), atribuindo o Vector2.zero:
![[TUTORIAL] Criando Plants Vs Zombies - parte 2 Untitled%2B11](https://3.bp.blogspot.com/-7qiOJWtHMC0/Ww78Q7h59kI/AAAAAAAAG34/REpnnfe_QQ4hGVmHEvLn-wlHEdGN8-sHwCLcBGAs/s1600/Untitled%2B11.png)
O valor de "vel" dentro do Vector2 está negativo porque o zombie se movimenta da direita para esquerda, ou seja, sempre indo para a esquerda, logo, esse valor deve ser negativo, pois se fosse positivo ele iria se movimentar sempre para a direita.
Salve o script (CTRL+S).
Agora selecione o objeto do zombie e através do inspector altere as variáveis de velocidade e vida.
Como esse é o zombie padrão do jogo, eu deixei ele numa velocidade de 6 e a vida em 10, porém conforme você crie outros zombies durante o seu projeto, você pode ir alterando esses valores (deixando os zombies mais resistentes e até mais rápidos).
Também relacione o AudioSource na variável "sound":
![[TUTORIAL] Criando Plants Vs Zombies - parte 2 Untitled%2B12](https://3.bp.blogspot.com/-1NtI2GNGLis/Ww79Wg0DDKI/AAAAAAAAG4E/ozmpFnwgVrIkHKaPkoigvFkkOfMf7F0hgCLcBGAs/s1600/Untitled%2B12.png)
Detectando as plantas:
Agora que controlamos a movimentação do zombie, podemos fazer com que ele coma alguma planta, caso encontre alguma pelo caminho.
Para detectar a planta, podemos criar um método para isso chamado "DetectPlant", e dentro desse método podemos disparar um raycast que sai do zombie, e caso esse raycast colida com um objeto no layer "Plants", o zombie começa a comer a planta, pois nesse layer só teremos elas.
Crie uma variável do tipo "RaycastHit2D" chamada "hit" e faça com que ela receba o método Raycast através da classe "Physics2D".
O raycast será disparado do zombie (transform.position) à sua esquerda sempre, ou seja, Vector2.right negativo, numa curta distância de 0.3f para ser bem rente ao colisor da planta, no layer "Plants":
![[TUTORIAL] Criando Plants Vs Zombies - parte 2 Untitled%2B13](https://3.bp.blogspot.com/-624OM4lvUyE/Ww7_RKaF8kI/AAAAAAAAG4Q/h6VHcp3JHn8-HrD121KsWa4mnI6eEXPlgCLcBGAs/s640/Untitled%2B13.png)
Então se o raycast encontrar com algum colisor (ou seja, hit.collider não será nulo) isso significa que ele poderá parar e comer a planta.
Para ele iniciar o ataque à planta, primeiro podemos mudar a sua animação, fazendo com que o parâmetro "isEating" fique true, canWalk vai ficar false, assim o zombie pára e não vai mais se mover, e o som do zombie comendo poderá ser reproduzido.
Caso o raycast não colida com nada, significa que o zombie pode continuar andando, ou seja, paramos o áudio dele comendo, trocamos a animação fazendo com que "isEating" fique false, e podemos fazer com que canWalk e canHit fiquem true, permitindo que o zombie possa andar e possa comer (caso encontre alguma planta):
![[TUTORIAL] Criando Plants Vs Zombies - parte 2 Untitled%2B14](https://2.bp.blogspot.com/-GhU0DZwlcs0/Ww8AUXDwAxI/AAAAAAAAG4c/oNb8yy93s10yPWLlZfsbfZqb8ga_ofx5ACLcBGAs/s640/Untitled%2B14.png)
Porém, não basta apenas que ele reproduza um áudio e mude a animação para indicar que o zombie está comendo a planta, precisamos de fato retirar a vida da planta cada vez que o zombie a atacar.
Para que não tiremos a vida da planta muito rapidamente e ela vá à 0 em poucos segundos, podemos criar uma corrotina que vai retirando a vida da planta à cada 2 segundos.
Para tal, crie um método que retorne um IEnumetator com o nome de "DelayEat" e que aceita como parâmetro um Collider2D (para sabermos de qual planta iremos retirar a vida).
Dentro desse método chame o yield return new WaitForSeconds(2) e após esses dois segundos retire a vida da planta de acordo com seu collider.
Só que como o método "DetectPlant" irá ser chamado dentro do Update, faremos com que consequentemente a corrotina seja chamada muitos frames por segundo enquanto estivermos colidindo com a planta, então mesmo com a espera de 2 segundos esse tempo não será totalmente respeitado, porque a corrotina vai ser chamada muitas vezes seguidas, então para acabar com esse problema, faça com que a variável "canHit" gerencie quando a corrotina pode ser chamada, ou seja, enquanto estiver true chamaremos ela, do contrário não.
Então dentro do método "DelayEat" já faça com que canHit fique false, e só após os 2 segundos ela voltará a ficar true:
![[TUTORIAL] Criando Plants Vs Zombies - parte 2 Untitled%2B15](https://4.bp.blogspot.com/-_2l-09kWMDU/Ww8B2PAJeBI/AAAAAAAAG4o/x5K7kL4MzJoSdl3toL2EaL5oBRJ2sz7LgCLcBGAs/s1600/Untitled%2B15.png)
Para tirar a vida da planta, basta utilizamos o seu collider para identificarmos qual planta de fato colidiu com o raycast do zombie, e depois basta utilizar o script "Properties" que contém a variável "life" da planta e realizar seu decremento para diminuir a vida, ou seja, ela irá perder uma unidade de vida à cada 2 segundos enquanto o zombie colide com ela.
Volte para o "DetectPlant" e chame a corrotina somente se "canHit" for verdadeiro, passando como argumento justamente o collider da planta, ou seja, hit.collider.
Dentro do 'else', faça com que a corrotina pare, assim se a planta já morreu ou foi removida, a corrotina parará de ser chamada:
![[TUTORIAL] Criando Plants Vs Zombies - parte 2 Untitled%2B16](https://3.bp.blogspot.com/-X7BAQ14xmzA/Ww8C-WKO4GI/AAAAAAAAG40/y9nmADiLNpgyGzNY-uaOI7Qum413qyQ0gCLcBGAs/s1600/Untitled%2B16.png)
Fazendo com que o zombie morra:
Nos próximos tutoriais irei criar o comportamento de cada planta aqui do remake, e isso inclui fazer com que as PeaShooters atirem contra os zombies fazendo com que eles morram, ou seja, precisamos também desenvolver seu terceiro e último comportamento, que seria fazer com que ele morra.
O método é bem simples, basta criá-lo sem retorno com o nome de "CheckDeath" e verificar se a vida dele (zombieLife) é menor ou igual a 0, e caso for, basta destruir o objeto:
![[TUTORIAL] Criando Plants Vs Zombies - parte 2 Untitled%2B18](https://4.bp.blogspot.com/-N2yZ0BoV4UM/Ww8EBWVzKOI/AAAAAAAAG5A/UKQ2yP0ohI09UZPFUyb5iesMvkXoMcRqgCLcBGAs/s1600/Untitled%2B18.png)
Eu disse que seria bem simples. '-'
Por fim, basta chamar os métodos "DetectPlant" e "CheckDeath" dentro do update e está pronto:
![[TUTORIAL] Criando Plants Vs Zombies - parte 2 Untitled%2B19](https://1.bp.blogspot.com/-dNpTPBlXaVo/Ww8EafRTjpI/AAAAAAAAG5I/mhTSpYqhrXA7HFmLXAhu4HoAgwGDWuuuQCLcBGAs/s1600/Untitled%2B19.png)
Salve o script e posicione o zombie em algum local correto da grama e teste o jogo, o resultado deverá ser esse aqui:
Já que tudo está correto, transforme esse objeto em prefab e salve a cena, porque no próximo tutorial iremos desenvolver o comportamento de cada planta, então até lá.
Re: [TUTORIAL] Criando Plants Vs Zombies - parte 2
Continua incrível
, tutoriais tão grandes que dão preguiça só de abrir ;-;

NKKF- ProgramadorMaster
-
PONTOS : 4394
REPUTAÇÃO : 574
Idade : 18
Áreas de atuação : Desenvolvedor na Unity, NodeJS, React, ReactJS, React Native, MongoDB e Firebase.
Respeito as regras :
Re: [TUTORIAL] Criando Plants Vs Zombies - parte 2
Até q esse é pequeno em comparação ao anterior kkkkkNKKF escreveu:Continua incrível, tutoriais tão grandes que dão preguiça só de abrir ;-;
Em breve vou fazer esses tutoriais em vídeo, que fica melhor de explicar, mas primeiro preciso de um microfone que preste. :roll:

» [TUTORIAL] Criando Plants VS Zombies (remake - Parte 1)
» [TUTORIAL] Plants VS Zombies na Unity!
» [TUTORIAL] Criando um simples Multiplayer [UNITY 5]
» [TUTORIAL]Criando seu Primeiro Jogo!
» [TUTORIAL]Criando um Breakout Game
» [TUTORIAL] Plants VS Zombies na Unity!
» [TUTORIAL] Criando um simples Multiplayer [UNITY 5]
» [TUTORIAL]Criando seu Primeiro Jogo!
» [TUTORIAL]Criando um Breakout Game
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos