Menu

04 – Tutorial Intermediário – Criando Personagem 2

E hoje chegamos ao quarto post do tutorial intermediário. E ai? Andam gostando do andamento ou anda muito pesado?

O que vamos trabalhar no post de hoje, será praticamente uma revisão da criação do personagem 1, então será bem leve, apenas rever o que já fizemos antes.

Caso, você já tenha feito o Prefab do seu Personagem1, é hora de excluí-lo da aba Hierarchy (Não confundir com a aba Project, hein!). Clica no Personagem1 na aba Hierarchy e aperta delete (Ou Clica com o botão direito sobre o Personagem1 e vai na opção Delete). Temos que excluir senão terá dois personagens fazendo a mesma coisa no cenário.

Bom, a primeira etapa será criar a pasta personagem2 dentro de Resources/sprites/personagens. Nessa pasta vamos criar as mesmas pastas que temos em personagem1 (andando, atacando, morrendo, parado, pulando) e uma nova pasta chamada flutuando:

As imagens dos sprites que usaremos, serão do mesmo site do Personagem1:

Ninja Girl

Link direto para o Download

Os sprites que iremos usar serão os seguintes:

andando -> Run
atacando –> Throw (Se lembra que nossa personagem feminina atacará a distância?)
pulando –> Jump
planando –> Glide (Será a animação da sua habilidade pulo duplo – Double Jump)
morrendo –> Dead
parado –> Idle

Após adicionar todos os sprites correspondentes a suas pastas, lembrem-se de trocar o tipo do da imagem de Texture para Sprite:

Bem, bem. Agora é hora de criar um objeto vazio na aba Hierarchy que chamaremos de Personagem2 e adicionaremos o componente Sprite Renderer:

No Sprite, selecionarei o primeiro Sprite da personagem ninja parada:

Clicando sobre a Personagem2 na aba Hierarchy, iremos agora na aba Animation, onde iremos criar a animação parado na pasta Resources/animations/personagens/personagem2:


Agora é só jogar os sprites Idle_00* da aba Project para a Animation e mudar a velocidade do Sample:


Vamos mais uma vez repetir o mesmo processo para as demais animações:

Lembrando-se de desmarcar o Loop das animações (atacando, morrendo, pulando):

Uma vez que todas as animações estiverem criadas, é hora de ir à aba Animator onde vamos criar os parâmetros:
Velocidade – Float
estaNoChao – Bool
atacou – Trigger
morreu – Trigger

Caso repare são os mesmos parâmetros usados no Personagem1 e não é à toa, afinal essas informações são passadas pela classe Jogador, que será comum a todos os personagens que você criar, por isso cuidado para não errar letras maiúsculas e escrita, ok?

Bom, mas não acabou por aqui ainda. Vou pedir para que vocês crie mais um novo parâmetro ,que será exclusivo da Ninja, que se chama voou do tipo trigger:

Este parâmetro irá ativar a transição da animação pulando para planando.

Agora é hora de organizar nossas animações, igual fizemos com o personagem1. Então, clica ali no olhinho para podermos ver melhor nossas animações:

Após organizar, iremos fazer as transições respeitando as seguintes condições:

parado -> andando (Condição: velocidade greater 0 | Has Exit Time == OFF)
andando -> parado (Condição: velocidade less 0.1 | Has Exit Time == OFF)
parado -> pulando (Condição: estaNoChao == false | Has Exit Time == OFF)
pulando -> parado (Condição: estaNoChao == true | Has Exit Time == OFF)
andando -> pulando (Condição: estaNoChao == false | Has Exit Time == OFF)
parado -> atacando (Condição: atacou | Has Exit Time == OFF)
andando -> atacando (Condição: atacou | Has Exit Time == OFF)
atacando -> parado (Condição: nada | Has Exit Time == ON)
Any State -> morrendo (Condição: morreu)

E por fim:

pulando -> planando (Condição: voou | Has Exit Time == OFF)
planando -> parado (Condição: estaNoChao == true | Has Exit Time == OFF)

“Ue, mas ficou diferente do Personagem1, lá nós tínhamos colocando uma transição de pulando para andando também”.

É verdade e é melhor deixar um padrão só, mas se lembram que eu falei que não teria problema? Deixarei assim para mostrar que não há diferença, pois assim que o personagem for para parado, ele já vai mudar direto para andando, caso o personagem esteja em movimento, conforme explique no post do primeiro personagem ^^

Personagem pronto, chegou a hora de fazer o que? Criar o script Personagem2. Então, bora lá, seu papel agora é criar um novo script dentro da pasta scripts/jogador:

Dando dois cliques, iremos abrir o Script, e aqui o primeiro passo será trocar a herança de MonoBehaviour para Jogador. Irá dar o erro que a classe Ataque não existe, então é só pedir para criar:

E também já podemos implementar no método do Unity, o Awake e o Status do nosso personagem (HP:10, MP: 12, Ataque: 5):

Script: Personagem2.cs

using UnityEngine;
using System.Collections;
using System;

public class Personagem2 : Jogador {

    void Awake() {
        status = new Status(10, 12, 5);
    }

    protected override void atacar() {
        throw new NotImplementedException();
    }
    
}

Como já criamos conhecemos essas estruturas de outros tutoriais só faltam duas coisas para terminamos esse tutorial! (Eu disse que os próximos seriam menores não é mesmo? Mas relaxem, que terão outros maiores sim, quando formos ver coisas totalmente novas).

Bom, agora vamos precisar criar o ataque. No primeiro personagem, nós criávamos um objeto fixo em frente ao personagem não é mesmo? No caso da Personagem 2, o ataque será bem parecido com a habilidade Slash do Personagem 1, ou seja, um objeto em movimento. Usaremos até os mesmos scripts (AtaqueAndante).

Então a primeira coisa a fazer é adicionar a imagem Kunai que está lá no zip dos sprites, ao seu projeto na pasta ataques:

Em seguida, criaremos um objeto vazio com o nome Kunai. Nele adicionaremos o Sprite Renderer com a nossa Kunai (Ou simplesmente arrasta a imagem da aba Project para a Hierarchy):

Agora, vamos adicionar um Box Collider 2D com a opção Is Trigger selecionada:

E para finalizar esse objeto, vamos adicionar o Script AtaqueAndante e definir a velocidade do ataque para 10 (Ou a velocidade que achar melhor):

O dano não precisa definir agora, iremos alterar via script.

Bom, com objeto pronto, basta agora arrastar esse objeto da aba Hierarchy para a pasta Project na pasta Resources/prefabs/jogador:

Pronto, já criamos o prefab da nossa kunai, já podemos exclui-la da aba Hierarchy e ir trabalhar no script do ataque do Personagem 2.

A primeira coisa que iremos fazer é criar uma variável pública do tipo AtaqueAndante com o nome kunai:

Script: Personagem2.cs

    public AtaqueAndante kunai;

Agora poderemos ir ao método ataque e fazer aquela nossa verificação se o personagem está atacando ou não e caso a variável atacando for igual a true (verdade), verificar se animação já acabou para permitir que novos ataques sejam realizados:

Script: Personagem2.cs

    protected override void atacar() {
        if (!atacando) {


        } else {
            atacando = animator.GetCurrentAnimatorStateInfo(0).IsName("atacando");
        }
    }

Basicamente igual ao Personagem1. Com isso feito, basta agora verificar se o jogador apertou o botão Ataque. Caso tenha iremos:

1 – ativar a animação de ataque através do trigger “atacou”;
2 – instanciaremos (criaremos) uma nova kunai (nosso prefab);
3 – Ao resgatar o script AtaqueAndante desse prefab, vamos definir que ele irá se autodestruir em 5 segundos (ou o tempo suficiente para sair da tela, que ainda não sabemos);
4 – Informaremos o local e a direção em que ele será criado
5 – Informaremos o seu poder de dano;
6 – Informaremos que o personagem está realizando um ataque

Script: Personagem2.cs

    protected override void atacar() {
        if (!atacando) {
            if (Input.GetButtonDown("Ataque")) {    //Apertou o botão de ataque
                animator.SetTrigger("atacou");      //Ativa animação
                var objAtaque = Instantiate(kunai); //Cria o objeto no cenário (Hierarchy)
                objAtaque.destroiObjeto(5f);        //Destroi objeto em 5 Segundos

                objAtaque.direita = direita;        //Define a direção que o objeto vai andar
                if (direita)                        //Verifica de qual lado do personagem será criado
                    objAtaque.transform.position = transform.position + Vector3.right;
                else
                    objAtaque.transform.position = transform.position - Vector3.right;

                objAtaque.dano = status.getAtaque(); //Define o dano que a Kunai causa

                atacando = true;                    //Informa que o personagem está atacando
            }
        } else 
            atacando = animator.GetCurrentAnimatorStateInfo(0).IsName("atacando");
    }

Basicamente tudo que a gente já viu nos posts anteriores.

Agora o que precisaremos fazer é voltar ao Unity e no nosso Personagem2, iremos adicionar o Rigidbody2D (Para aplicar a gravidade possibilitando nosso personagem cair quando não tiver no chão, porém com a Rotação travada para o personagem não sair girando) e os Colliders como fizemos com o Personagem1 (Um Circle Collider 2D nos pés e um Box Collider 2D no resto do corpo):

Com isto feito, agora é a hora de clicar com o botão direito sobre o Personagem2 e pedir para criar um novo objeto vazio, que chamaremos de chaoVerificador:

Vamos adicionar um Icone a ele clicando na caixinha ao lado do nome e o posicionar um pouco abaixo do personagem:

Por fim, podemos adicionar o script Personagem2 ao nosso objeto Personagem2 na aba Hierarchy e preencher os dados:

Basta dá play agora e ver se está tudo ok e fazer os refinamentos finais. Se achou uma animação demorando muito de mudar para outra, vai na aba Animator, clica na transição e diminuir o tempo da transição:

Neste caso diminui o tempo da transição de parado para atacando para 0, para evitar que o personagem ataque duas vezes antes da transição de parado para atacando ocorresse.

Bom, e com isso, terminamos esse post. Espero muito que tenham gostado e até semana que vem o/

Índice Tutorial Intermediário

Download do Projeto

Download do Jogo

Criador do Jogos Indie, amante de jogos, terror, música, anime e programação. Estudante de mestrado com foco em jogos na educação. Louco por Resident Evil e... sei lá, acho que é isso O.o

10 comments

  1. Deyvid Lira disse:

    O ritmo estar ótimo, aguardando a próxima lição. E principalmente a que lida com a UI que é a parte que tenho mais dúvida.

  2. alvaro disse:

    Muito bom os tutoriais.
    Tbm tenho duvidas nesta parte de UI, crio botões, mas ao compilar para Android eles ficam menores do que apresentam na unity

    • Valeu Alvaro o/

      Essa relação do UI, posições, tamanho e por ai vai sempre é uma dor de cabeça danada. Isso está relacionado a dois pontos. Um é de como o objeto é colocado no canvas e o outro é a configuração do canvas. No tutorial de menu, eu explico mais ou menos cada coisa. Se algo não ficar muito claro é só perguntar que eu tento explicar mais aprofundado 😉

  3. alvaro disse:

    Eu acho que encontrei o problema, criei o botão e aumentei a fonte e o tamanho dele, porém esqueci de mover as ancoras para o tamanho do botão. Como as ancoras vem de padrão juntinhas ela pegava o menor tamanho do botão possível.
    Que ferramenta usará pra pixel art? Espero que uma gratuita.

  4. Ferdinando disse:

    Bom tutorial amigo ^^
    Uma dúvida aki, coloquei um colisor chamado limite pra evitar q o personagem vá para determinado lugar, quero q quando o personagem colida com o colisor ele seja jogado pra trás tipo empurrado então fiz assim

    Void onCollisionEnter2D(collision2D colisor){
    if(gameobjetc.tag == “colisor”){
    posição -= 10
    PlayerBody.AddForce(new vector2(posição, 0))
    }
    }

    Onde posição eh um float q fica dentro do Update e q atodo momento recebe a posição do personagem em x graças a uma variável do tipo tranbsform q criei

    Qual o erro?? 🙁 o código n ta fazendo nd no jogo

    Peço perdão pelos erros de digitação pq tô digitando pelo cell mais na unity tá CERTinho

    Se puder responder agradeço

    • Bom, vou levar em consideração que os nomes nos script e métodos estejam corretos, como você falou.

      Então a primeira coisa é no if. No if você não está usando o objeto colisor e sim o objeto atual com o script para verificar se ele possui ou não a tag “colisor”.

      Caso você queira verificar se o objeto que você encostou tenha o colisor, deve por:

      if (colisor.gameObject.tag == “colisor”)
      ou
      if (colisor.gameObject.tag.Equals(“colisor”))

      segundo ponto é que o posicao, estiver sendo criado nesse método, deve adicionar o var antes:
      var posicao = -10;

      Ao usar o posicao -= 10 e caso essa variavel seja iniciada na declaração do script você vai estar aumentando cada vez mais a força a cada batida.

  5. Ferdinando disse:

    obg por responder amigo, olha só como fiz
    declarei uma variavel chamada posicaoIncial do tipo Transform no começo do script e uma variavel float chamada posicao
    dentro do Update fiz assim
    posicao = posicaoInicial.position.x //a todo momento a posicao recebe a posiçao incial de x

    e no metodo onCollsion fiz assim

    void OnCollisionEnter2D(Collision2D colisor){

    if(colisor.gameObject.tag == “limite”){
    Debug.Log(“colidiu”);
    body.AddForce(new Vector2(0,posicao));
    }
    }
    como falei quero q quando o personagem colida com o colisor ele leve um empurrao pra trás
    fiz e refiz e nao consigo ver onde ta o erro pois como falei o codigo n faz nd 🙁

    obs: body é uma variavel do tipo Rigidbody2D declarado no incio do script e coluqei a tag limite no
    objeto certinho
    me ajuda aiiii 🙁 🙁

  6. Ferdinando disse:

    Fiz uma modificação mesmo assim n foiii

    obg por responder amigo, olha só como fiz
    declarei uma variavel chamada posicaoIncial do tipo Transform no começo do script e uma variavel float chamada posicao
    dentro do Update fiz assim
    posicao = posicaoInicial.position.x //a todo momento a posicao recebe a posiçao incial de x
    e no metodo onCollsion fiz assim
    void OnCollisionEnter2D(Collision2D colisor){
    if(colisor.gameObject.tag == “limite”){
    Debug.Log(“Peitou”);
    posicao -= 5;
    body.AddForce(new Vector2(posicao,0));
    }
    }
    como falei quero q quando o personagem colida com o colisor ele leve um empurrao pra trás
    fiz e refiz e nao consigo ver onde ta o erro pois como falei o codigo n faz nd 🙁
    obs: body é uma variavel do tipo Rigidbody2D declarado no incio do script e coluqei a tag limite no
    objeto certinho
    me ajuda aiiii 🙁 🙁

Deixe uma resposta

Parceiros

Steam Brasil LoboLimão Centro RPG Lab Indie
Mundo Gamer PodTerror

Anunciantes

Aglomerando - Agregador de conteúdo
Uêba - Os Melhores Links GeraLinks - Agregador de links Piadas Idiotas - São idiotas mas o faz rir Tedioso: Os melhores links LinkLog MeusLinks.com - Informação e conteúdo todos os dias para você! Agregador de Links - Madruga Links 4Blogs - Agregador de conteúdo Está no seu momento de descanso né? Entao clique aqui!