Menu

Tutorial Unity 2D #4 – Animação

Olá meu povo Indie! Estudaram bem como fazer seu personagem se mover e a estrutura de um script? Preparados para aprender a fazer a animação dos seus personagens? Então vamos dar vida aos nossos personagens.

Esta aula de hoje será mais fácil que a passada, mas é bom que já tenha se familiarizado um pouco com a estrutura de script, pois vamos começar a mexer nele com mais frequência. Então mãos a obra e vamos começar.

O primeiro passo é abrir o nosso projeto. Estando com ele aberto, na aba Hierarchy clique sobre o heroi_sprite (ou o nome que você deu para os sprites do seu herói).

animação 01 - heroi sprite - jogos indie

Em seguida deixe a aba Animation selecionada e na aba Project, selecione o sprite que usamos para fazer o herói na posição inicial (heroi_sprite_7) e o arraste para a aba Animation. Será solicitado que você salve o conteúdo. Você provavelmente estará na raiz do seu projeto, então crie uma nova pasta chamada “animations” e dentro desta pasta crie uma nova pasta chamada “player”. Nela iremos colocar todas as animações do nosso player. Salve a sua animação com o nome “player_parado” ou algum outro nome que represente o seu personagem quando ele estiver parado.

animação 02 - adicionando sprite default - jogos indie

Ok! Já criamos a nossa primeira animação. A animação do player quando ele estiver parado (Estranho não?), agora vamos criar a animação do nosso player quando estiver andando. Para Isto, observe na Animation que existem dois botões à esquerda, um de gravação e um de play, correto? Abaixo deles existe um select com as animações do seu personagem. Ao clicar neste select, verá a opção [Create New Clip]. Selecione essa opção e novamente na pasta animations >> player, salve essa animação com o nome player_andando.

 animação 03 - create new clip - jogos indie

Agora de volta a aba Project, selecione segurando ctrl os sprites heroi_sprite_6, heroi_sprite_7, heroi_sprite_8, que são responsáveis pelas animações do personagem andando. Arraste-os e solte-os na aba Animation. Deverão aparecer os três keyframes do seu personagem, cada uma com um Sprite. Caso você aperte o play da aba Animation, já poderá ver seu personagem se movimentando.

animação 04 - gerando movimentacao - jogos indie

Porém, a menos que você queira que seu personagem seja o The Flash, ele deve estar muito rápido. Para isto você pode alterar a opção Sample de 60 para 10. Agora dê play e veja se a velocidade do seu personagem esta boa ou ainda precisa ficar mais lento ou mais rápido. Poderá ajustar essa velocidade movendo os keyframes (Aqueles losangos onde tem a imagem do personagem na aba Animation) ou através da opção samples, como fizemos anteriormente. Caso tenha esquecido algum frame, basta arrasta-lo para a posição que você quiser.

Ok! Nossas duas principais animações estão feitas, agora precisamos definir quando cada uma será executada. Para isto, vamos à aba Animator. Nela poderá ver todas as animações já criadas e vinculadas ao sprite_heroi na nossa aba Hierarchy. Na aba Animator, você poderá clicar e arrastar as animações para uma posição que fique mais fácil de visualizar o seu fluxo. Aqui iremos informar as transições, dizendo a partir de qual animação para qual outra ela poderá ir e quando ir. Se reparar vai ver que existe outra opção chamada Any State. Quando colocarmos uma transição saindo desta, significa que a qualquer momento, esta transição poderá ser executada, desde que sua condição tenha sido realizada.

Vamos exemplificar: Digamos que nosso personagem tivesse uma animação para double jump. Esta animação só poderia ocorrer quando ela estivesse na animação pulando, concorda? Já animação “morrendo”, poderia ocorrer em qualquer momento, ou seja, “Any State”. Ficou claro?

animação 05 - aba animator - jogos indie

Agora clique com o botão direito sobre a animação player_parado e verá um menu com as opções Make Transition e Set as Deafult, correto? A opção “Set As Default”, torna a animação padrão, ou seja, é a animação que irá começar quando o jogo iniciar. Então sempre preste atenção em qual animação sua é a padrão. A outra opção, Make Transition será a responsável por indicar para qual e quando a animação deverá trocar.

Selecione a opção Make Transition do player_parado e clique em player_andando. Verá que uma seta saindo de player_parado está indo para player_andando, correto? Agora na parte inferior dessa aba cilque no “+” da opção Parameters e adicionei um novo parâmetro do tipo Float com o nome movimento. A seta indica que da animação player_parado, ela poderá ir para player_andando e o parâmetro movimento, será responsável por indicar quando isso vai ocorrer.

animação 06 - transition - jogos indie

Clique na seta do player_parado para player_andando. Na aba Inspector, verá no final a opção Conditions. Selecione as opçãos “movimento” e “Greater” “0”, igual à imagem abaixo.

animação 07 - conditions - jogos indie

Isso significa que quando o movimento do personagem for maior que zero, está condição será ativada e a animação de player_parado irá mudar para player_andando. Então precisamos agora fazer o mesmo, no sentido contrario. Clique com o botão direito sobre o player_andando, selecione a opção Make Transition e clique no player_parado. Agora vamos ter uma seta de player_andando para player_parado. Clique nesta seta e na aba Inspector, em Conditions, selecione as opções: “movimento”, “Less”, “0.1”.  O que significa que quando movimento for menor do 0.1, seu player irá passar da animação player_andando para player_parado.

animação 08 - conditions 2 - jogos indie

Já organizamos as animações, falamos quando ela será ativada e para qual animação irá. Agora precisamos ir para o script do player, aonde vamos informar o valor do parâmetro movimento. Vá na aba Project e dê dois cliques no nosso script Player. Espere o Mono Develop abrir.

A primeira coisa a se fazer no nosso projeto é adicionar as variáveis antes do método Start:

public Transform spritePlayer;
private Animator animator;

Agora dentro do método Start, vamos adicionar uma linha deixando nosso método da seguinte forma:

void Start () {
                animator = spritePlayer.GetComponent ();
}

Vamos entender agora o que acabamos de fazer. A variável spritePlayer servirá para pegar o conteúdo vinculado ao sprite heroi_sprite. Dele nós queremos ter o controle de tudo que fizemos na aba Animator. Por isso que fizemos dentro do método Start, ou seja, quando o personagem for criado, nós iremos jogar as configurações da aba Animator do heroi_sprite na variável animator do nosso script.

Agora vamos jogar um valor dentro do parâmetro movimento. Para isto no método Movimentacao(), vamos adicionar as seguintes linhas:

animator.SetFloat("movimento", Mathf.Abs (Input.GetAxisRaw ("Horizontal")));

Esta linha irá jogar dentro do parâmetro movimento, um valor 0 ou maior que 0. O Mathf.abs serve para pegar o valor absoluto de Input.GetAxisRaw (“Horizontal”). Sendo assim não importa se ele for para a direita ou para esquerda, o valor retornado nunca será negativo. Com isto o parâmetro movimento receberá 0 quando o personagem estiver parado e maior que zero, quando estiver se locomovendo. Salve seu script e volte ao Unity.

Na aba Hierarchy, clique no Player e no Inspector procure pelo script Player. Lá arraste o heroi_sprite da aba Hierarchy para a variável Sprite Player do seu script no Inspector.

 animação 09 - script - jogos indie

Agora é só dar Play e ver o resultado. Seu personagem já deve estar andando e você já aprendeu como fazer a animação do seu personagem. Porém quando pulamos, nosso heroi ainda fica mexendo as pernas no ar. Então vamos adicionar mais uma animação, a do personagem pulando, para revisar tudo que já vimos e ver outros tipos de parâmetros.

Vamos novamente clicar sobre o heroi_sprite na aba Hierarchy e depois vamos para a aba Animation. Lá vamos selecionar a opção [Create New Clip] e dentro da pasta animations >> player, agora vamos salvar nossa animação com o nome player_pulando.

Dentro da animação, você poderá escolher qual Sprite achar melhor. Eu vou utilizar o Sprite heroi_sprite_7.

animação 10 - animation pulando - jogos indie

Na aba Animator, vamos criar um novo parâmetro chamado chao do tipo Bool (Verdadeiro ou falso). Faça as transições indo e vindo do player_pulando.

animação 11 - parametro chao - jogos indie

Nas transitions indo em direção ao player_pulando, vamos marcar as condições chao e false. Nas transitions saindo do player_pulando, vamos trocar para chao e true.

animação 12 - conditions chao - jogos indie

Tudo certo no Animator, vamos voltar para o nosso script Player no MonoDevelop, vamos adicionar a linha animator.SetBool(“chao”, estaNoChao), logo após a nossa variável estaNoChao no método Movimentacao:

estaNoChao = Physics2D.Linecast(transform.position, chaoVerificador.position, 1 << LayerMask.NameToLayer("Piso"));
                               animator.SetBool ("chao", estaNoChao);

Feito é só salvar o script e dá play no unity. Agora nosso personagem quando pula não fica mais mexendo as pernas como antes.

Com isto nosso tutorial de movimentação acabou. Espero que tenham gostado. No final do post vou disponibilizar de novo o script do Player completo para vocês. E estou pensando nas próximas partes do tutorial. Acredito que ficaram sendo:

  • Cenário e Câmera
  • Vida e Magia
  • Inimigos
  • Sons e música.
  • Menu, Nova Fase e Game Over

O que acham? Ao finalizar esse projeto pretendo fazer um jogo mais simples, algo como um Flappy Bird.

estaNoChao = Physics2D.Linecast(transform.position, chaoVerificador.position, 1 << LayerMask.NameToLayer("Piso"));
		animator.SetBool ("chao", estaNoChao);

.
Feito é só salvar o script e dá play no unity. Agora nosso personagem quando pula não fica mais mexendo as pernas como antes.

Com isto nosso tutorial de movimentação acabou. Espero que tenham gostado. No final do post vou disponibilizar de novo o script do Player completo para vocês. E estou pensando nas próximas partes do tutorial. Acredito que ficaram sendo:
• Cenário e Câmera
• Vida e Magia
• Inimigos
• Sons e música.
• Menu, Nova Fase e Game Over
O que acham? Ao finalizar esse projeto pretendo fazer um jogo mais simples, algo como um Flappy Bird.

using UnityEngine;
using System.Collections;

public class Player : MonoBehaviour {

	public float velocidade;
	public float forcaPulo;
	private bool estaNoChao;
	public Transform chaoVerificador;
	public Transform spritePlayer;
	private Animator animator;

	//Tudo que ocorre quando o personagem e criado
	void Start () {
		animator = spritePlayer.GetComponent ();
	}
	
	//Tudo que ocorre enquanto o personagem existe
	void Update () {
		Movimentacao();
	}

	//Responsavel pela movimentacao do personagem
	void Movimentacao() {

		//Seta no paramentro movimento, um valor 0 ou maior que 0. Ira ativar a condicao para mudar de animacao
		animator.SetFloat("movimento", Mathf.Abs (Input.GetAxisRaw ("Horizontal")));

		//Anda para a direita
		if (Input.GetAxisRaw("Horizontal") > 0 ) {
			transform.Translate (Vector2.right * velocidade * Time.deltaTime);
			transform.eulerAngles = new Vector2(0, 0);
		}

		//Anda para a esquerda
		if (Input.GetAxisRaw("Horizontal") < 0 ) {
			transform.Translate (Vector2.right * velocidade * Time.deltaTime);
			transform.eulerAngles = new Vector2(0, 180);
		}

		//Verifica se esta no chao
		estaNoChao = Physics2D.Linecast(transform.position, chaoVerificador.position, 1 << LayerMask.NameToLayer("Piso"));
		animator.SetBool ("chao", estaNoChao);

		//Responsavel pelo pulo
		if (Input.GetButtonDown("Jump") && estaNoChao) {
			rigidbody2D.AddForce(transform.up * forcaPulo);
		}
	}
}

PS: As barras duplas no código (//), faz com que tudo que esteja na linha seja ignorado. Isso são comentários, que ajudam a entender melhor o código.

Parte 3 - Movimentação

Parte 5 - Cenário #1

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

87 comments

  1. Felipe Caldas disse:

    meu player ficou pulando assim que dou play no game… alguma dica ?

  2. Thiago Faino disse:

    Nome disso é vacilo…

  3. Jogos Indie disse:

    Cara foi mal, só vi hoje seu comentário >.<. Caso não tenha visto a parte de Cenário (parte 1), ela já está disponível. A parte 2 é pra sair dia 3/10, mas estou super apertado essa semana, mas farei o possível para sair nesse dia. ^^

  4. Jogos Indie Sem problema mano

  5. Daniel disse:

    Na hora que do play para ver se meu personagem esta andando ele da esse erro no console.

    MissingComponentException: There is no ‘Animator’ attached to the “heroi_sprite” game object, but a script is trying to access it.
    You probably need to add a Animator to the game object “heroi_sprite”. Or your script needs to check if the component is attached before using it.

    Alguém pode me ajudar :/

    • Desculpa a demora Daniel. Está ficando meio difícil acompanhar todos os comentários, mas bora lá.

      Esse erro ai significa dizer que você provavelmente colocou o script dentro do heroi_sprite E o Animator no objeto Player.

      Ou seja, basta tirar o script que tiver no heroi_sprite para por no Player. Por isso que ele está tentando acessar algo que não existe. Imagine que sejam dois objetos diferentes, o script em um e o animator em outro.

  6. Jean disse:

    Unable to create animatable SpriteRenderer component
    UnityEngine.Debug:LogError(Object)

    ao tentar arrastar os sprites para a aba animations 🙁

    • Quase não achei informação alguma na internet sobre esse erro O.o

      Bom, então bora tentar resolver nós mesmo o/.

      a primeira coisa que eu vou pedir para fazer é criar um SpriteRenderer. Eu explico isso mais na frente, mas como você nesta aula clique sobre o seu objeto na aba Hierarchy. Depois na aba Inspector vá em Add Componente >> Rendering >> Sprite Renderer.

      Após adiciona-lo, neste componente procure pelo campo: Sprite dentro do Sprite Renderer e tente adicionar por lá o sprite da posição inicial.

  7. Daniel disse:

    To com uma duvida de novo. Na hora que eu to play meu personagem começa a voar do nada, sem aperta nenhuma tecla. Tipo fica voando devagar sem parar.
    O que pode ser ?

  8. Jean disse:

    e só uma dica. no final do tutorial 12 ainda esta escrito Parte 13 – Save e Load (Em breve) e sem o link
    😀

  9. Deyvid Lira disse:

    Cara muito obrigado seus tutoriais são ótimos e muito bem organizados, está me ajudando muito. Estou na aula 10, mas voltei aqui porque estou com um problema na animação do Player, fica tremendo quando movimento, ao que percebi o translate estar alterando o valor do eixo Z. Mas não entendo o por que.

  10. Opa Deyvid, beleza?

    Cara, se ele está tremendo pode ser também a animação. Verifica se todos os sprites estão com a mesma altura e largura, do contrário pode causar uma pequena epilepsia no personagem durante a animação 😉

  11. Deyvid Lira disse:

    Opa beleza, verifiquei a largura e a altura estão as mesmas, a única coisa estranha que vejo é que quando ando para esquerda, transform.eulerAngles = new Vector2(0, 180); o position z fica alterando. E também se eu tiro o translate a animação roda normal.

  12. carloswgama disse:

    Para não alterar, pode usar o Vector3(0, 180, 0)

    Se o erro continua manda para meu email: carlos@jogosindie.com, que eu olho 😉

  13. Deyvid Lira disse:

    Funcionou perfeitamente, muito obrigado ^^!

  14. Luan disse:

    Olá, quando e pressiono o botao para andar para a esquerda o personagem some, tanto na aba ‘scene’ quanto na aba ‘game’, só para a esqueda, quando ando para a direita funciona bem, alguma maneira de resolver ?

  15. Guilherme disse:

    Man, na aninmação da minha sprite , a sprite que coloca no player fica na frente, pq?

  16. thawan disse:

    Quando eu tento testar o personagem andando aparece a seguinte mensagem “index < m_BoolCount" o que sera?

  17. Igor Silva disse:

    Muito bom o tutorial , muito bem explicado , parabéns para a equipe ai do site , e nã deixem de postar tutoriais , pq sao muito bons.

  18. Marcola disse:

    Muito bom o tutorial, mas o meu ta dando um bug, na qdo meu player anda pra direita continua normal, mas qdo ele vai pra esquerda ele inverte o cenario, tem haver com a camera? ou é bug mesmo?

  19. carloswgama disse:

    Tem sim Marcola

    A sua camera deve estar como filha do personagem, né? Neste caso é só remove-la dai de dentro que o problema resolve. Em outro tutorial (Acho que é no de cenário), aprendemos um script para a camera seguir o personagem ;).

  20. luan disse:

    Opa!! Cara, gostaria de saber se uma imagem de umas madeirinhas que vc disponibilizar no tutorial pode ser usadas em um jogo que será publicado..

  21. carloswgama disse:

    Infelizmente não cara, essas são imagens disponibilizadas no google imagem. Mas não sei te dizer se elas são livres de direitos autorais para conteúdo comercializado.

    No caso de comercialização eu recomendo criar suas próprias imagens, buscar em sites de licença livre (free image) ou até mesmo comprar pacotes de imagens.

  22. Bruno Brisa disse:

    to ficando loko aki nao ta dando certo aki a animação … tipo qndo dou play fica o Hero_sprite na frente do player … dai joguei o hero sprite dentro do player , mas só hero sprite anima … se puder dar uma ajuda ….

  23. carloswgama disse:

    Eu não entendi o que você falou .-.

    Mas pelo jeito o sprite está em um objeto e o animator está em outro. Tem que ser tudo no mesmo.

  24. ram9000 disse:

    Olá, tudo bem?

    Estou tendo um problema entre a transição pulando e andando. Quando o personagem bate no piso, ele segue na posição Pulando por um tempo até finalmente entrar na animação Andando.

    Consegui resolver isso aumentando para 1000 o sample do Player_pulando (mesmo não sendo uma animação como no seu exemplo). Creio que isso não seja o mais apropriado.

    Eu tambem ja desabilitei o Exit Time entre as transições. Entre Parado e Andando, eu fiz um ajuste no Transition Graph e melhorou , mas no Pulando > Andando, só consegui o mesmo efieto no Sample;

    Alguma dica?

    ps: Parabéns pelos tutoriais, muito bons!

  25. carloswgama disse:

    Já vi umas pessoas reclamando de andando para parado, mas de pulando para andando é a primeira pessoa O.o

    Quais as condições que você colocou na transição? O erro pode estar nas condições ou no código.

  26. Gustavo Alves disse:

    Opa Tarde. Estou com problema nessa parte da animação. no texto vc diz pra arras a imagens dele parado q o programa vai pedir para salvar. aqui não esta salvando. ai tento fazer de outra forma mas acabo criando outro personagem no jogo quando e simulado. fica um parado la e outro se mexendo fora que no animetion fica com uns retangular que não aparecem no seu exemplo, e que eu não criei, um verde escrito entry e outro vermelho exit.
    acho que é por causa de eu não conseguir salva arrastando a imagens como diz no texto. alguma dica ?
    Dede já agradeço

  27. Pessoal, tive alguns problemas que creio serem por conta da minha versão do Unity (5). No passo do tutorial onde eu deveria arrastar o primeiro sprite 7 para o animation, não apareceu opção de salvar. Dessa forma, primeiro criei um animation vazio com o nome player_parado na pasta animations>>player e depois inseri o sprite 7 pra dentro dessa animation (na guia Animation mesmo).
    Outra coisa que aconteceu foi de a imagem do player parado ficar à frente do player andando, não consegui resolver isso de verdade, mas visualmente resolvi da seguinte forma:

    clique no heroi_sprite na aba Hierarchy e, na aba Inspector, marque o campo “Order in Layer” com o número 1.

    Uma coisa que mudei foram os tempos de transição de um movimento pra outro, fiz isso mexendo nas setas que definimos a ordem de movimentos no Animator, indo no Inspector e mudando os campos exit time e transition duration…

  28. Jefferson disse:

    Muito bom esses tutoriais, estou desenvolvendo um jogo com uma galera e esses tutoriais estão sendo a base, muito obrigado mesmo!

  29. Meu personagem está demorando para movimentar os pés, ele anda normalmente mas demora para mudar o sprite, porque sera?

  30. carloswgama disse:

    Lá na parte onde você seleciona a condição (Aba Inspector) da transição no Animator de parado para andando e vice-versa. Verifica se tem uma caixinha com o nome “Has Exit Time”, selecionada.

    Se tiver é só desmarcar e ser feliz 😉

  31. Ranny disse:

    Galera estou usando o seguinte script para saltar no jogo que estou criando, apenas para adquirir conhecimento por isso a simplicidade, mas gostaria de saber como fazer para criar uma transição da animação de correr para o pulo. Agradeço desde já!

    using UnityEngine; // Obrigado por avisar desta linha gamesinsanity

    public class Player : MonoBehaviour
    {
    // The force which is added when the player jumps
    // This can be changed in the Inspector window
    public Vector2 jumpForce = new Vector2(0, 300);

    // Update is called once per frame
    void Update ()
    {
    // Jump
    if (Input.GetKeyUp(“space”))
    {
    GetComponent().velocity = Vector2.zero;
    GetComponent().AddForce(jumpForce);
    }
    }
    }

  32. carloswgama disse:

    da mesma forma daqui Ranny.

    Você vai executar aquele passo:
    //Verifica se esta no chao
    estaNoChao = Physics2D.Linecast(transform.position, chaoVerificador.position, 1 << LayerMask.NameToLayer("Piso"));
    animator.SetBool ("chao", estaNoChao);

    E depois fazer uma transição de correndo para pulando, de forma que verifique se o personagem não está no chão (chao == false)

  33. Henrique Hanthequeste disse:

    Olá Carlos!

    Estou enfrentando um problema aqui, quando eu crio a animação, ela funciona certinho, porém, fica um sprite fixo, por cima da minha animação. Sabe como resolver?

    P.s: Uso Unity 5

    • Henrique.

      Verifica se a animação foi feita no mesmo objeto que tem o sprite.

      Acredito que deve ter um objeto pai com o Sprite Renderer (Sprite fixo) e um objeto filho com a animação: Animator + Sprite Renderer(A animação se movendo)

  34. Arthur Ueta disse:

    Carlos, será que você poderia me tirar uma dúvida?
    Após inserir a animação do “parado” para o “andando”, quando eu solto a tecla de andar e ele faz a essa transição, ele ainda faz a animação de andar por um tempinho antes de ficar totalmente parado… isso seria alguma configuração no animator?

    Obrigado!

    • E aê Arthur, beleza?

      Sim, é uma configuração no Animator sim (Essa configuração foi adicionada de forma diferente no Unity 5.1).

      Quando você clica na transição, lá na aba Inspector aparece as condições correto? Lá tem um Checkbox marcado (Has Exit Time)
      http://jogosindie.com/wp-content/uploads/2015/09/has-exit-time.jpg

      É só desmarca-lo.

      Esse checkbox ai marcado, faz com que a transição só mude de uma para outra, quando ela completar todos os sprites do Animation. (Ou seja é válido em sprites de ataques, já que você não quer que ele sai da animação no meio do animação) 😉

  35. Arthur Ueta disse:

    Carlos, muito obrigado pela resposta!

    Segui a sua orientação e ficou bem melhor do que estava… parece que precisa de alguns ajustes ainda…
    De qualquer forma, vou seguir com o tutorial… assim após finaliza-lo eu retorno para os detalhes no qual não consegui concluir de forma satisfatória.

    Mais uma vez agradeço a resposta super rápida!

    Abraço!

  36. Tou usando o Unity 5.x e a aba ‘Animator’ não existe … como devo proceder?

    • Existe sim Ítalo.

      No meu lá do topo, procure a opção Window e nela procure o Animator 😉

      no 4.6 ela também não vem como default habilitada. Na parte 1 do tutorial, quando eu explico a visão geral do Unity eu mostro como habilita-la. ^^

  37. MUITO OBRIGADO cara … agora posso seguir com o tutorial

  38. Arilson disse:

    Caso eu queira usar duas condições para uma animação, como ficaria o código?

    • mesma coisa, Arilson.

      lá no animator você adiciona o segundo parametro e a condição igualzinho como fez na primeira.

      Já no código, você também faz da mesma forma, executa uma e depois a outra. Exemplo:
      //Em uma parte do código
      animator.setBool(“chao”, true);

      //Em outra parte do código
      animator.setFloat(“velocidadeSubindo”, velocidadeSubindo);

      Ai você verificou se o personagem não está no chão e se ele está subindo ou caindo, para caso queira uma animação para cada uma dessas ocasiões.

  39. Lucas Zottis disse:

    Bom dia Carlos

    Quando aperto play, meu personagem até se mexe, mas não executa a animação andando.

    • Neste caso pode ser muito coisa Lucas.

      Vou listar algumas coisas:
      1 – Verifica se o Objeto que tem oscript é o mesmo objeto que tem as animações
      2 – Verificar se na Animator a transição do personagem parado para andando realmente existe (A setinha e a condição)
      3 – Verificar se a condição da transição tem movimento greater than 0
      4 – Verificar se no script realmente adicionou isso:
      animator.SetFloat(“movimento”, Mathf.Abs (Input.GetAxisRaw (“Horizontal”)));

      Depois desses testes você me diz se funcionou ou não ^^

  40. Lucas Zottis disse:

    Agora mexe, eu havia nomeado o para movimento com letra maiúscula e no script esta minusculo.
    Eu tenho uma duvida, esta certo meu personagem mexer as pernas quando pular em movimento?

    • depende da animação Lucas. Eu acho que nesse tutorial eu fiz a animação pulando parada (Sem mover as pernas).

      Só para completar, na versão 5.1 tem um checkbox na condição da transição chamada Exit Time, se não me falha a memoria. Se ela estiver marcada, você a desmarca.

      Marcada – Ela termina a animação antes de mudar para outra (Boa para animações de ataque)
      Desmarcada – Ela para a animação na hora e já inicia a da transição (Boa para movimentação)

  41. Olá! Fiz tudo como vc disse, mas na hora de apertar Espaço para pular ele não pula, e a animação só funciona quando o chaoVerificador está desativado.
    O que fazer? =)

    • Neste caso é bom verificar se o chaoVerificar retorna true quando está no chão. Caso não pode ser:
      1 – pouco espaço entre o chaoVerificador e o Personagem
      2 – Faltou adicionar o Layer ao Chao
      3 – O nome do Layer está escrito de forma diferente do script e no Unity.

      • Agora funcionou =)… Só que quando eu uso o Pulo o personagem some do mapa! Tipo O Goku usando teletransporte hahaha.. O que fazer?

        • O valor do Y sobe até 100 depois cai até o infinito .. wtf ‘0’

          • Consegui resolver. Diminui o valor da forcaPulo de 200 para 7 xD

          • Fiz umas modificações no código e adicionei animação de Andando2 (cima-vertical) no programa, com o código de inverter o angulo para baixo, mas não está funcionando =/… O que fazer?

            Script:

            using UnityEngine;
            using System.Collections;

            public class PlayerController : MonoBehaviour {

            public float velocidade = 10; //Velocidade que o personagem anda
            private int direcao = 4; //1 – cima | 2 – direita | 3 – baixo | 4 esquerda
            private Animator animator; //Animator do personagem
            public Transform spritePlayer;
            private bool chao;
            public Transform chaoVerificador;
            private float movimento2 = 2; //1 – cima/ 2 – baixo

            void Start () {

            animator = spritePlayer.GetComponent ();
            animator = GetComponent() as Animator; //Pega o Animator do objeto que tambem possui esse script, que acredito ser o mesmo
            }

            void Update () {

            Movimentacao ();

            }
            void Movimentacao() {

            animator.SetFloat(“movimento”, Mathf.Abs (Input.GetAxisRaw (“Horizontal”)));
            animator.SetFloat(“movimento2”, Mathf.Abs (Input.GetAxisRaw (“Vertical”)));

            //Direita
            if (Input.GetAxisRaw(“Horizontal”) > 0)
            {
            direcao = 2;
            transform.Translate(Vector3.right * velocidade * Time.deltaTime);
            transform.eulerAngles = new Vector2 (0, 0);
            }
            //Esquerda
            if (Input.GetAxisRaw(“Horizontal”) 0)
            {
            direcao = 1;
            movimento2 = 2;
            transform.Translate(Vector3.up * velocidade * Time.deltaTime);
            }
            //Baixo
            if (Input.GetAxisRaw(“Vertical”) < 0)
            {
            direcao = 3;
            movimento2 = 2;
            transform.Translate(-Vector3.up * velocidade * Time.deltaTime);
            }
            //Informa para o animator trocar a animação da direção do personagem
            animator.SetInteger("direcao", direcao);

            //Verifica se está movimentando
            chao = Physics2D.Linecast(transform.position, chaoVerificador.position, 1 << LayerMask.NameToLayer("Piso"));
            animator.SetBool ("chao", chao);
            animator.SetFloat ("movimento2", movimento2);

            }
            }

            • Coloquei o Script errado.. O correto é esse aqui:

              using UnityEngine;
              using System.Collections;

              public class PlayerController : MonoBehaviour {

              public float velocidade = 10; //Velocidade que o personagem anda
              private int direcao = 4; //1 – cima | 2 – direita | 3 – baixo | 4 esquerda
              private Animator animator; //Animator do personagem
              public Transform spritePlayer;
              private bool chao;
              public Transform chaoVerificador;
              private float movimento2 = 2; //1 – cima/ 2 – baixo

              void Start () {

              animator = spritePlayer.GetComponent ();
              animator = GetComponent() as Animator; //Pega o Animator do objeto que tambem possui esse script, que acredito ser o mesmo
              }

              void Update () {

              Movimentacao ();

              }
              void Movimentacao() {

              animator.SetFloat(“movimento”, Mathf.Abs (Input.GetAxisRaw (“Horizontal”)));
              animator.SetFloat(“movimento2”, Mathf.Abs (Input.GetAxisRaw (“Vertical”)));

              //Direita
              if (Input.GetAxisRaw(“Horizontal”) > 0)
              {
              direcao = 2;
              transform.Translate(Vector3.right * velocidade * Time.deltaTime);
              transform.eulerAngles = new Vector2 (0, 0);
              }
              //Esquerda
              if (Input.GetAxisRaw(“Horizontal”) 0)
              {
              direcao = 1;
              movimento2 = 2;
              transform.Translate(Vector3.up * velocidade * Time.deltaTime);
              }
              //Baixo
              if (Input.GetAxisRaw(“Vertical”) < 0)
              {
              direcao = 3;
              movimento2 = 2;
              transform.Translate(-Vector3.up * velocidade * Time.deltaTime);
              }
              //Informa para o animator trocar a animação da direção do personagem
              animator.SetInteger("direcao", direcao);

              //Verifica se está movimentando
              chao = Physics2D.Linecast(transform.position, chaoVerificador.position, 1 << LayerMask.NameToLayer("Piso"));
              animator.SetBool ("chao", chao);
              animator.SetFloat ("movimento2", movimento2);

              }
              }

              • Corrigido >:

                //Cima
                if (Input.GetAxisRaw(“Vertical”) > 0)
                {
                direcao = 1;
                movimento2 = 1;
                transform.Translate(Vector3.up * velocidade * Time.deltaTime);
                }

                • Cara, infelizmente esse script que você está fazendo está muito errado ou muito confuso (Ou os dois :S)

                  Primeiro, eu não entendi o porque da variável movimento2, se você seta o valor do animator no inicio do script, então não tem motivo para ele existir lá embaixo também >.< E no seu caso eu não sei exatamente o que você quer fazer com o movimento2. O movimento ainda existir beleza, será ele que vai definir se o personagem está andando ou parado. Mas o movimento2, para que serve? No caso ao invés de ser movimento2 seria a direção que ele está, não? No script você colocou que quando o jogador apertar para a direita (if (Input.GetAxisRaw("Horizontal") > 0)), o personagem vai para direita. Acho que quando colocar para a esquerda (if Input.GetAxisRaw(“Horizontal”) 0), está faltando o sinal de < ai antes do zero), ele vai para cima (Vector3.up), quando aperta para baixo a direção é 3 e quando aperta para cima a direção volta a ser igual a direita O.o Outro ponto confuso é que você está colocando o chão verificador para verificar se o personagem está realmente no chão, mas numa visão de cima igual Zelda, o personagem sempre não vai estar no chão? O.o, ou seja é uma ideia totalmente diferente. O chão verificador serve para jogos de plataforma com essa visão lateral. Como eu não estou vendo o seu jogo não tem como eu ter a noção do que você quer fazer, de como está à cara do jogo, mas acho que você está tentando avançar sem antes ter entendi o a ideia de cada função. Então o que eu digo é calma. Não tente avançar para o próximo post sem antes de entendi realmente do porque que eu fiz cada coisa. Uma coisa que eu não gosto em tutoriais, é que o povo faz as coisas não explica porque fez, só faz e espera que as pessoas copiem. Aqui eu explico porque eu faça cada coisa, pois a ideia não é copiar e sim vocês aprenderem para que possam fazer seus próprios códigos como você está querendo fazer, porém pelo que dá para perceber você está avançando sem entender para que serve cada coisa que foi criada. Primeiro entenda para que serve para cada uma dessas coisa, não apenas leia e imite o que eu fiz, entenda o porquê que eu fiz assim. Depois que você entender é que você vai começar a alterar o script. Minha recomendação é voltar ao post anterior, reler, tentar entender e fazer pequenas alterações como mudar a força, velocidade, botões e outras pequenas alterações para entender melhor, mas não mudar o estilo do jogo totalmente sem antes ter entendido para que cada coisa serve .-., porque esse script desse post é totalmente diferente de um script de um jogo com visão isométrica, então calma ai :/

                  • Ah.. Fiz uma bagunça lá no codigo.. heuaheuhaeae
                    Queria colocar movimento2 como rotacao pra vertical (cima,baixo) para o programa não confundir com o movimento normal, ja que a direcao estava (horizontal), e também colocar andando2 (sprite Cima,Baixo) para não confundir com andando comum (sprite direita,esquerda). e no Animator quase consegui colocar o personagem rotacionando pra cima, só que ele estava indo solo..’0′

  42. John Brandão disse:

    Tudo funcionou certinho, mas quando eu viro de direção o meu herói da uma deslizada chão antes de entrar na animação “andando”. Consigo resolver esse problema ?

    Muito obrigado pelo tutorial.

    • Neste caso John, volta lá no Animator e clica na setinha de transição. Olha lá na aba Inspector se a opção Has Exit Time esta marcada. Se tiver, desmarque.

      Ela opção faz com que a animação só mude após chegar no ultimo frame da animação. É bom para animações de ataque, que queremos ver completa, mas não para animações de movimento, onde ela deve parar na hora.

  43. John Brandão disse:

    Ele já estava com o Has Exit Time desmarcado, mas ainda tinha um Fixed Duration marcado, depois que tirei ele também está tudo fluindo muito melhor.

    Obrigado pela atenção.

  44. marca a opção “chao” na aba animator e ele vai parar de pular quando da play.

  45. Diogo Muniz disse:

    Carlos, virei a noite tentando resolver isso e não consegui.

    Meu player não faz movimento horizontal durante o pulo. Nem pula enquanto anda. Tenho que liberar as teclas de movimento horizontal pra pular. E durante o pulo, se tento o movimento horizontal, o player volta instantaneamente pro chão. Como se cancelasse a animação do pulo.

    Aposto que deve ser a coisas mais óbvia d mundo pra resolver, mas não achei… ¬¬

    Parabéns pelo tutorial e pelo código, já tinha visto outros e o seu está muito simples e funcional.

    Vlw!

    • Diogo Muniz disse:

      A parte de pular e mover eu consegui resolver.
      Mas andar e pular, não… :/

    • A parte da animação deve ser alguma regra no Animator ou algum parâmetro que você não está passando ao se mover, mas você já resolveu.

      Quanto ao fato de não conseguir pular ao se mover, parece que você está usando else O.o

      if (Input.GetAxisRaw(“Horizontal”) > 0 ) {

      } else if (Input.GetAxisRaw(“Horizontal”) < 0 ) { ... } else { if (Input.GetButtonDown("Jump") && estaNoChao) { ... } } Se estiver usando else, é só remover, pois o uso do else anula as outras ações. Qualquer coisa fala ai.

  46. Samuel disse:

    O meu personagem está normal, mas tem uma coisa que está me intrigando: ele tem um delay pra executar os movimentos. Alguém sabe como resolver?

    • – Se for um delay na animação você pode aumentar a velocidade na opção Samples

      – Se for um delay para trocar a animação (Caso esteja utilizando o Unity 5), desmaque a opção Has Exit Time que tem lá no animator dentro das transições (Mesmo local que você coloca a condição para a animação, lá tem um checkbox chamado Has Exit Time, é só desmarca-lo)

  47. Samuel disse:

    Valeu, Carlos. Era o Has Exit Time que estava marcado. Aliás, ótimos tutorias, obrigado por ter feito eles.

  48. Ola, estava seguindo o tutorial. Meu Unity é o 5.
    Eu estava terminando tudo, estava funcionando tudo. Ai eu mechi nas imagem da bolFogo para fazer a animação. Ai a bola parou de funcionar. Eu comecei a dar Ctrl+Z, ai o programa travou, . Mas quando eu re-abri ele, a bolafogo só caia, não subia mais. Alguém sabe o que pode estar errado? Eu revi tudo e deveria estar funcionando ‘-‘

  49. Marcus Matheus disse:

    estou com o mesmo problema,quando eu coloco as condições como esta no tutorial a animação fica estatica na animação pulo(que fica executando direto) e nao deixa as outras animações executarem,como parado ou andando,

  50. Diogogeda disse:

    Tudo tranquilo até o momento! Valeu!

  51. Ricardo Campos de Oliveira disse:

    Estou usando a versão 5.5 do unity e quando utilizo a linha.

    void Start()
    {
    animator = spritePlayer.GetComponent();
    }

    ele acusa erro no getcomponent.

    Assets/Scripts/Player.cs(18,33): error CS0305: Using the generic method `UnityEngine.Component.GetComponent()’ requires `1′ type argument(s)

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!