Menu

Tutorial de Unity 2D #3- Movimentando personagem

Depois de um longo tempo sem fazer postagem do tutorial de Unity 2D, vamos continuar aqui no processo, dando vida a nosso personagem!


Como falei, a ideia dessa parte do Tutorial é aprender a movimentar nosso personagem, logo vamos ver como fazer nosso herói andar e pular. E felizmente ou infelizmente a gente vai começar com a parte de programação, sendo assim, quem não domina programação, pode sentir um pouco de dificuldade nessa hora, mas tentarei explicar de forma que todos entendam, ok?

Voltando ao nosso projeto, se lembram da pasta scripts que criamos na parte 2 do Tutorial de Unity 2D? Vamos usa-la neste momento. Clique com o botão direito sobre a pasta scripts, selecione “Create” e por fim “C# Script”.

Vamos dá o nome do nosso código de “Player”. Nesse script ficará todas as ações que nosso personagem poderá fazer. Uma vez criado dê dois cliques sobre o script Player e será aberto uma nova janela, o MonoDevelop, a ferramenta de desenvolvimento do Unity.

Para quem não é acostumado com programação, vou apresentar alguns conceitos de uma forma que ajude a vocês. Na imagem abaixo eu separei 3 cores, para explicar o que é cada uma.

Vermelho – Em vermelho, está o nome da nossa class ou script ou objeto como quiser chamar. Ou seja, quando usarmos esse script, tudo que tiver dentro dele é o que poderá ser realizado. Exemplificando, nós poderíamos criar um script/objeto “Pessoa” e todas as ações comuns às pessoas seria atribuído nesse script. Logo poderíamos usar o mesmo script “Pessoa” em “João” e “Maria”, mas não poderíamos usa-lo em no cachorro “Bob”. Então seria preciso criar um script só para Cachorro.

Verde – Em verde são todas as funcionalidades que este script possui. No exemplo que falei, caso criássemos um script para pessoa, poderíamos por as ações “Andar”, “Nadar”, “Comer”, “Falar”. Ou seja, cada método desses realiza uma tarefa especifica do conjunto “Pessoa”. No modelo do script do Unity nós temos Start e Update. Dentro do “Start” a gente faz tudo que quisermos que seja realizado, quando o objeto é instanciado. Sendo assim tudo que a gente quiser que ocorra quando nosso Player seja criado, colocamos aqui. Dentro do “Update”, iremos colocar tudo que a gente quiser que ocorra enquanto o objeto existir. Exemplo, enquanto o jogador existir eu quero que ele possa andar, logo criaríamos um novo método chamada Andar e a colocaríamos dentro do Update.

Amarelo – O “MonoBehaviour” em amarelo, nada mais é do que outro script/objeto que já tem seus métodos definidos e está passando tudo isto para o script do “Player”. Exemplificando, nós poderíamos ter os scripts Cachorro e Gato, que herdariam o que possuem de comum de outro script chamado Animal. Sendo assim não precisaríamos ter que criar novamente todos os métodos que já existem em Animal.
Para explicar mais um ponto importante do nosso script, vou pedir para que vocês adicione o seguinte texto antes do método Start.

public float velocidade;

Seu código deverá ficar assim:

Esse novo código que adicionei é um atributo do nosso script Player. O atributo velocidade é do tipo float (como se fosse um decimal, número com virgula) e é publico, ou seja o valor pode ser alterado em outros locais fora do script. Se a gente não quisesse que esse valor fosse alterado por outros objetos, colocaríamos como privado (private). Exemplificando melhor, digamos que tivéssemos um único script para diferentes armas, logo precisaríamos de atributos como “municao” e “potencia” (Não se usa acentuação em código). Conseguiram entender melhor? O atributo que criamos agora a pouco, para o script do player, deverá controlar a velocidade com que o nosso personagem irá se mover. Vamos agora fazer a movimentação dele.

O primeiro passo é criar um novo método void (Não retornar nenhum valor) com o nome “Movimentacao”, preferencialmente abaixo do método Update para deixa-lo organizado. E junto vamos adicionar uma condição, que quando o botão da seta direita for pressionado, o personagem deverá mover-se para a direita. Seu código será:

void Movimentacao() {
	if (Input.GetAxisRaw(“Horizontal”) > 0 ) {
		transform.Translate (Vector2.right * velocidade * Time.deltaTime);
	}
} 

O termo if, ele é uma condicional, ou seja ele verifica se algo é verdade ou falso. Input é atributo do script MonoBehaviour que verifica todos os botões que foram apertados. GetAxisRaw(“Horizontal”) é um método que retorna 1, quando clicando na seta da direita ou -1 quando clicamos na seta da esquerda. Sendo assim estamos verifica SE (if) o valor retornado é maior que zero, ENTÃO, ele irá entrar dentro da condicional, SENÃO nada acontece.

Dentro da condicional, nós temos o atributo transform, que é responsável por todas as ações e valores do transform do objeto lá no Inspector (Imagem abaixo, para lembra-los) e informamos que o objeto deve movimentasse (Translate) para direita (Vector2.right), na velocidade definida. Como o método Update é executado a cada vez que o jogo é processado, então adicionamos junto a velocidade o Time.deltaTime, para que a velocidade seja comum em todos os computadores, independente da velocidade do processamento de cada um.

Antes de testarmos, bora atualizar o nosso método Update, adicionando o método Movimentacao dentro dele.

void Update () {
	Movimentacao();
}	

Agora salve o script (ctrl+s) e podemos ir ao teste. Voltando ao Unity, clique no Objeto Player na aba Hierachy e agora na aba Inspector vá em Add Component >> Scripts >> Player.

Seu script deve aparecer agora na aba Inspector e o atributo velocidade que deixamos como público poderá ser alterado por aqui. Adicione o número 3 na velocidade e em seguida dê o player.

Se tiver realizado todos os procedimentos de forma correta, ao clicar na seta para a direita, seu personagem deve caminha nessa direção. Caso você clique na seta para a esquerda, nada acontecerá, pois ainda não definimos nada para a esquerda no método Movimentacao, então bora lá fazer isso agora. Voltando ao MonoDevelop (Caso tenha fechado, basta dá dois cliques no script na aba Project), no método Movimentacao vamos repetir a condicional que usamos para a direita e ao invés de usarmos Vector2.right, vamos usar –Vector2.right e ao invés de verificarmos se o AxisRaw Horizontal é maior que zero, vamos verificar se é menor que zero. Nosso código ficará:

void Movimentacao() {
	if (Input.GetAxisRaw("Horizontal") > 0 ) {
		transform.Translate (Vector2.right * velocidade * Time.deltaTime);
	}

	if (Input.GetAxisRaw("Horizontal") < 0 ) {
		transform.Translate (-Vector2.right * velocidade * Time.deltaTime);
	}
}

Caso você salve e teste lá no Unity, verá que ele já anda para a esquerda, porém fazendo um moonwalker e não queremos isso certo? Então ao invés de o fazermos ir para a esquerda, vamos fazer com que ele vire para trás e continue andando na direção que estava indo, em outras palavras nosso herói sempre irá andar pra frente e nunca de costa, a única coisa que irá fazer é virar para frente ou para trás de acordo com o botão que clicarmos. Para isso atualize o seu código de Movimentacao para:

void Movimentacao() {
	if (Input.GetAxisRaw("Horizontal") > 0 ) {
 		transform.Translate (Vector2.right * velocidade * Time.deltaTime);
 		transform.eulerAngles = new Vector2(0, 0);
 	} 	if (Input.GetAxisRaw("Horizontal") < 0 ) {
		transform.Translate (Vector2.right * velocidade * Time.deltaTime);
		transform.eulerAngles = new Vector2(0, 180);
	}
} 

Parando para analisar, perceberá que não importa qual tecla a gente aperta, ele sempre irá mover a direita do objeto. Porém ao clicarmos para a seta da esquerda, estamos dizendo que o ângulo do objeto (transform.eulerAngles) agora será invertido em 180º no eixo de Y. E quando clicarmos para a direita, ele voltará a sua posição inicial como o criamos. Em outras palavras, nós estamos girando o personagem para que ande para a posição que desejamos. Teste o código agora no Unity.

Movimentação ok, agora nós vamos para ultima parte desse tutorial. Fazer nosso personagem pular. Para isto volte ao MonoDevelop e adicione uma nova condicional ao método Movimentacao, deixando seu método da seguinte forma:

void Movimentacao() {
	if (Input.GetAxisRaw("Horizontal") > 0 ) {
		transform.Translate (Vector2.right * velocidade * Time.deltaTime);
		transform.eulerAngles = new Vector2(0, 0);
	}

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

	if (Input.GetButtonDown("Jump")) {
		rigidbody2D.AddForce(transform.up * forcaPulo);
	}
}

E abaixo do atributo velocidade adicione também o seguinte valor:

public float forcaPulo;

Vamos entender agora o nosso método de Movimentacao. Foi adicionada uma nova verificação, que analisa se o botão responsável pelo pulo, Input.GetButtonDown("Jump"), que por padrão é a tecla Espaço do teclado foi pressionada. Caso tenha sido, ele irá entrar na condicional aonde será aplicada uma força para cima contra a gravidade no rigidbody do nosso Player, graças ao comando rigidbody2D.AddForce(transform.up * forcaPulo). Realizado esses passos, salve e volte pro Unity. Na aba Inspector do Player, verá que no Script agora aparece o atributo Forca Pulo. Coloque 200 e clique no play, para testar.

Seu personagem agora já deve pular ao clicar no espaço, não é mesmo? Porém se você clicar várias vezes ele vai continuar subindo e como nosso herói não tem asas e não estamos fazendo um Flappy Bird, vamos ter que fazer uma verificação, para que ele apenas possa pular, caso esteja no chão. Para isto, primeira coisa que devemos fazer é criar um novo objeto no menu GameObject >> Create Empty. Vamos dar o nome de chaoVerificador para o objeto criado, adicionando o ao objeto Player, em seguida posiciona-lo um pouco abaixo do personagem e mudar a cor dele para identificarmos melhor, já que é um objeto transparente. Você pode mudar a cor do objeto na aba Inspector como pode ver na imagem a seguir:

O próximo passo é clicar no objeto Chao do Hierarchy e no campo Layer na aba Inspector. Vamos criar um novo layer para os objetos onde nosso personagem pode andar e consequentemente pular.

Clique em Add Layer e em um campo vazio (No meu caso o 8) adicione um layer com o nome Piso. Feito isto, volte ao objeto Chao e escolha o Layer Piso.

Para finalizar vamos voltar ao MonoDevelop no script Player e adicionar mais um atributo do tipo Bool e privado, uma vez que ele não precisará ser alterado fora do script. Este atributo servirá para verificar se o personagem esta no chão. E outro atributo do tipo Transform, para pegar a posição do objeto chaoVerificador.

private bool estaNoChao;
public Transform chaoVerificador; 

No nosso método Movimentacao adicione a seguinte linha:

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

Este comando serve para jogar dentro do atributo estaNoChao verdadeiro ou falso. Onde será analisado se entre o personagem (transform.position) e o objeto chaoVerificador (chaoVerificador.position), existe algum conteúdo com o Layer Piso (1 << LayerMask.NameToLayer("Piso")). Caso exista será atribuído o valor verdadeiro no atributo estaNoChao. Se você começou a pegar o jeito com programação, acho que já entendeu o que deve fazer agora. Vamos alterar a condicional do pulo para:

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

Para versão do Unity 5+

if (Input.GetButtonDown("Jump") && estaNoChao) {
	GetComponent().AddForce(transform.up * forcaPulo);
}

Como pode ver, apenas adicionamos dentro do if, o valor “&& estaNoChao”, onde o && significa “E”. Logo SE apertamos no botão do pulo E estaNoChao é verdade, ENTÃO ele poderá pular. Com nosso script de movimentação pronto, salve e vamos voltar pro Unity, clique no Player e depois arraste o objeto chaoVerificador para o atributo Chao Verificador no script.

Com isto lá na hora de verificarmos, se existe algum conteúdo com o layer “Piso” entre o personagem e o atributo do script chaoVerificador, ele irá utilizar o objeto que acabamos de selecionar. Aperte Play e teste, senão funcionar, tente por o objeto chaoVerificador mais abaixo do personagem para garantir que existe algo entre eles ou se você realmente aplicou o Layer piso no objeto Chao.

Se tudo funcionou, então chegamos ao final desta parte do tutorial. Sei que é um pouco complicado para quem não tem tanta experiência em programação, mas eu tento fazer de forma que todos compreendam. Caso você gostou e realmente queira se aprofundar no desenvolvimento de jogos, eu recomendo que você estude um pouco de programação. Existem alguns tutoriais no Youtube ou caso deseje realizar um curso, andei pesquisando na internet e achei este CRESÇA BRASIL, que é barato e mostra apenas o básico que será preciso para realizar seus jogos, sem se aprofundar em coisas que você não irá usar no Unity.

Deixando aqui no final da pagina o Script na sua forma final, caso já queira pegar ele pronto e aplicar em seu jogo.

using UnityEngine;
using System.Collections;

public class Player : MonoBehaviour {

	public float velocidade;
	public float forcaPulo;
	private bool estaNoChao;
	public Transform chaoVerificador;

	// Use this for initialization
	void Start () {
	
	}
	
	// Update is called once per frame
	void Update () {
		Movimentacao();
	}

	void Movimentacao() {

		estaNoChao = Physics2D.Linecast(transform.position, chaoVerificador.position, 1 << LayerMask.NameToLayer("Piso"));
  		if (Input.GetAxisRaw("Horizontal") > 0 ) {
			transform.Translate (Vector2.right * velocidade * Time.deltaTime);
			transform.eulerAngles = new Vector2(0, 0);
		}

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

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

Na próximo tutorial vamos ver como fazer as animações dos personagens correndo e pulando. Até a próxima e bons estudos!

OBS 1: Não se esqueça de salvar seu script, scene e project
OBS 2: Caso no Unity um atributo que você colocou como public não apareça, significa que você não salvou ou que seu script possui algum erro, então procure ver se não está faltando algum “}” ou “;” que são os erros mais comuns na programação.

Parte 4 - Animação
Parte 2 - Adicionando o personagem

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

223 comments

  1. Doge Leal disse:

    Poxa, se vocês continuassem ficaria tão feliz, vocês explicam tão bem!

  2. Jogos Indie disse:

    Pode ficar tranquilo que existe continuação. Por sinal que é o de animação ;]

  3. Doge Leal disse:

    Jogos Indie Sim, eu vi, vocês fazem um ótimo trabalho.

    E, tenho uma pergunta, vocês podem responder?

  4. Jogos Indie disse:

    Doge Leal caso eu saiba responde-la, então sim

  5. a parte de programação que desanima

  6. Caio Silvério disse:

    tem como vc fazer um curso sobre logica de programação no unity?

  7. Parabéns, muito melhor que ver vídeos

  8. Jogos Indie disse:

    Um post inteiro só dedicado a lógica de programação? Acho que seria uma boa. Porém programação é algo realmente enorme e não compensaria apresentar muita coisa. Mas gostei da sua ideia. Tem algo em especifico que gostaria que eu apresentasse?

  9. Jogos Indie disse:

    Te entendo perfeitamente. Antes de saber programar, também não gostava dessa parte, mas depois que aprendi tomei gosto pela coisa. Num futuro, irei fazer tutoriais de engines que não usem programação ou que a programação seja opcional. Mas enquanto isso não ocorre, estou pensando em pegar a dica do Caio Silvério e fazer um sobre programação básica voltado ao Unity, para ajudar vocês.

  10. Caio Silvério disse:

    Jogos Indie Então cara eu tava pensando sobre programação básica de C# ou javascript, nem que seja apenas para explicar os conceitos básicos, como vareáveis e tals…

  11. Jogos Indie disse:

    Caio Silvério Entendi. Nesse mês agora de outubro eu lanço um tutorial extra sobre programação com Unity usando C#.

  12. Uma dúvida:
    O método Linecast da classe Physics2D retorna true ou false caso haja um layer entre os objetos que no nosso caso é o Player e o chaoVerificador. O método nameToLayer da classe LayerMask retorna o indice desse layer.E quanto ao 1 para que serve?

  13. Jogos Indie disse:

    Opa Ewerton. Então o Linecast ele retorna true caso algo cruze uma linha que inicia em no caso no player e termina no chaoVerificador. Quando eu fizer um tutorial de script, eu vou exemplificar melhor isso usando a função drawLine do Debug:

    Debug.DrawLine (transform.position, chaoVerificador.position)

    O terceiro campo é um filtro, onde dizemos que ele só vai retornar true se um objeto do layer "Piso" cruzar essa linha.

    Sendo assim o LayerMask.NameToLayer ("Piso"), vai retornar o index do LayerPiso que é 8. Se lembra quando cadastramos o Layer, lá em User Layer, o colocamos no número 8?

    Pronto, o "1 <<" serve para transformar esse número em uma mascará de bits de forma que:
    Index 0 = 1
    Index 1 = 2
    Index 2 = 4
    Index 3 = 8
    Index 4 = 16
    Index 5 = 32
    Index 6 = 64
    Index 7 = 128
    Index 8 = 256
    ….

    Ou seja, ele associará o mascara 256 para o Layer de index 8. Agora porque eles fizeram assim ao invés de reconhecer direto o index do Layer, eu não sei lhe responder .-.

    Entendeu para que server o "1 <<"? Basicamente para fazer essa conversão.

  14. Jogos Indie disse:

    Fui dá uma estudado na possível causa. Acredito que o motivo de ser assim é porque transformando os dados em binários, poderá por mais de layer nessa regra sem conflito. Exemplo:
    Layer 8 + Layer 1 = 9
    Layer 4 + Layer 5 = 9

    Porém em bits isso ficaria assim:
    256 + 2 = 258
    16 + 32 = 48

    Espero ter esclarecido!

  15. Jogos Indie obrigado pela explicação. Esclarecido agora.
    Excelente tutorial !

  16. fiz passo a passo e meu personagem não pula, oque eu faço ?

  17. Jogos Indie disse:

    Opa Jhonata, beleza? Se seu personagem não esta pulando, pode ser um desses problemas:
    1 – chaoVerificador muito proximo do personagem;
    2 – o seu objeto chão, não esta com o Layer Piso;
    3 – O LayerMask.NameToLayer ("Piso") está escrito errado;
    4 – Você não setou no unity quem é o chaoVerificador;
    5 – Se esta chamando a ação no botão certo (Input.GetButtonDown("Jump"))
    6 – Você esta apertando o botão certo? (Brincando)

    Faça o seguinte, coloque abaixo do:
    estaNoChao = Physics2D.Linecast(transform.position, chaoVerificador.position, 1 << LayerMask.NameToLayer("Piso"));

    o seguinte código:
    Debug.DrawLine (transform.position, chaoVerificador.position)

    Verifique na aba de scenes, apareceu uma linha entre o personagem e o chaoVerificador e se entre essa linha o chão cruza.

    Se tiver tudo ok, nessa parte faça mais um teste. Remova o estaNoChao do if
    if (Input.GetButtonDown("Jump") && estaNoChao). Assim saberemos se o problema esta na variavel estaNoChao ou não.

  18. thomas disse:

    tem um poblema qaqui quando chego na parte de bota a velocidade não aparesseu aqui

  19. Se a vida não aparece no Unity e ela está como public, significa que existe algum erro no script. Verifique naquela linha na parte mais baixa do Unity se aparece alguma mensagem de erro. Provavelmente é algum “;” ou “}” faltando.

  20. Izaldo disse:

    Muito bom cara sabe explicar simples e descomplicado

  21. Jesiel Elias Schwengber disse:

    Excelente tutorial, mas eu to com um problema aqui, se puder ajudar, hehe.

    Na hora de adicionar o script .cs no componente player, não aparece a opção SCRIPT mas apenas NEW SCRIPT

    A versão do Unity é 4.5.5

    • E aê Jesiel. Acho que tu é novo por aqui, pois não vi teu nome antes (E acho que lembraria =P), então seja bem vindo o/

      Quanto a sua dúvida é o seguinte. Isso que você esta falando é o Add Component, correto?

      A opção SCRIPT ela só vai existir se você já tiver algum script criado no seu projeto, o que provavelmente ainda não tem.

      Então você cria um novo script (Pode ser no NEW SCRIPT mesmo ou clica com o botão direito dentro da aba Project e vai em CREATE >> C# Script). Depois de criado (Se lembre de escolher a opção C#), cole o código ai no final do post e estará pronto para adicionar na opção SCRIPTS.

      Mas recomendo que para aprendizagem crie, assim no futuro será capaz de montar os seus próprios 😉

      • Jesiel Elias Schwengeber disse:

        Pois então cara, agradeço por ter respondido.

        O problema que tive foi que eu criei o script, exatamente como o tutorial, porém na hora de adicionar o script no gameObject a opção SCRIPTS não aparecia.

        Por muita sorte, na minha escola a ferramenta Unity está instalada, sendo que é uma versão mais antiga, aqui aparece a opção.

        Então vou ver se acho a mesma versão que tem aqui na escola pra continuar com o tutorial.

        E novamente, excelente trabalho. Muito bem explicado!

  22. Hugo tamura disse:

    Olá, muito boa sua aula, mas fiquei com dúvidas , como que vc criou aquele objeto Chao pq isso me confundiu para fazer a leyer piso, a outra duvida é que quando eu aperto para direita e depois aperto
    para esquerda meu personagem aparece atrás da tela sabe como arrumar esse bug?. Obrigado, parabéns pela aula 😀

  23. Pessoal, tenho a seguinte situação com a “movimentação”, quando meu game object move-se para trás(esquerda) eu o viro com EulerAngles 180 graus, porém ao virá-lo, as minhas layers que estavam por trás passam a ser as da frente bagunçando as sprites.

    Como resolver? É um 2D.

    • Pelo que você está falando, parece que você colocou a camera dentro do Player. Se for isso, basta tira-la.

      No tutorial de Cenário eu explico como fazer um script para camera seguir o player ^^

  24. Renan Nunes disse:

    Não consigo fazer o circle collider ter a mesma velocidade que o sprite. O que pode ser isso?

  25. Daniel disse:

    Faço tudo certinho os códigos no C# Script mas o Unity sempre alega que a um erro nele :/

    • Se preferir pode mandar para mim o script, para eu verificar se tem algum erro mesmo. Normalmente no Unity, na aba Console, ele informa a linha do erro.

      Vai que é alguma besteira e você não esteja vendo O.o

  26. Samuel disse:

    Ótimo tutorial. Mas não estou conseguindo fazer meu personagem se movimentar para direita.

    • Ele fica parado ou se move errado? Acredito que o problema esteja no trecho do if:

      if (Input.GetAxisRaw(“Horizontal”) > 0 ) {
      transform.Translate (Vector2.right * velocidade * Time.deltaTime);
      transform.eulerAngles = new Vector2(0, 0);
      }

      verifica se escreveu os campos certinho. Se o erro continua é só falar.

  27. Daniel disse:

    Tipo eu vi a linhas de erro nele através do console mais sempre que corrijo um aparece mais. Por onde eu posso enviar o Script para você verificar o que tem de errado ?

  28. Felipe Vidal disse:

    Cara, seguinte eu rotaciono o object transform quando clicko nas setas e tal, porém os coliders se comportam como se não estivessem mudado de direção, fica tipo, se eu rotaciono o transform do player e ele fica de costa pro monstro executa a ação da mesma forma que executa quando esta de frente a ele.

    • É, esse é um bug supeeer chato do Unity 2D, que ainda não arrumaram.

      Outra pessoa também já reclamou sobre isso. Esse script desse tutorial o mais fácil, porém só é valido para colliders centrais. No caso de collider mais afastados eu fiz esse script aqui para o Victor Hugo:

      if (Input.GetAxisRaw(“Horizontal”) > 0){
      transform.Translate (Vector2.right * velocidade * Time.deltaTime);

      if (!direita) {
      Vector3 theScale = transform.localScale;
      theScale.x *= -1;
      transform.localScale = theScale;
      direita = true;
      }

      parado=false;
      }

      if (Input.GetAxisRaw(“Horizontal”) < 0 ) { transform.Translate (-Vector2.right * velocidade * Time.deltaTime); if (direita) { Vector3 theScale = transform.localScale; theScale.x *= -1; transform.localScale = theScale; direita = false; } parado=false; } Ou seja ele não altera a rotação do objeto e sim a escala.

  29. Márcia Prates disse:

    Alguém poderia me ajudar, estou tentando fazer o meu primeiro jogo e estou fazendo um tabuleiro de damas, só que não estou conseguindo fazer as peças se moverem nas direções corretas.

  30. Opa Márcia beleza?

    Isso está me soando trabalho de faculdade. É Unity mesmo ou outra linguagem de programação?

    Qualquer coisa manda para meu email teu problema detalhado para que eu veja o que posso fazer:
    [email protected]

  31. rivastech disse:

    mais que logica de programacao, acho que seria legal algo do tipo orientacao a objeto (nao sei se pra voces é a mesma coisa). mas para quem está inciiando é útil. conceitos como polimorfismo, herença e tal.

  32. carloswgama disse:

    Mas ai é que está. Eu estou apenas focando na programação para Unity e não em programação em geral. Tanto é que eu falei que o ideia é fazer um curso de algoritmo ou C# para aprender a programar mesmo.

    Se eu fosse fazer um curso voltado a programação pura, iria desvincular do tutorial. E temos que ter em mente que nem todo mundo aqui tem interesse em focar no lado da programação (Embora na minha opinião seja crucial, ter pelo menos uma pessoa que saiba bem de programação na equipe), por isso apenas expliquei os conteúdos que eles mais vão usar no dia dia.

    Sem falar que uma explicação mais profunda de programação: orientação a objeto, código estruturado, estrutura de repetição, decisão, polimorfismo… iria demorar uns 3 posts ou mais fora do contexto de Unity, tendo vários outros sites com essas explicações .-.

    Além do mais, para esse primeiro tutorial não foi usado nada de herança e polimorfismo

  33. rivastech disse:

    eu tive alguns problemas nesta parte do tutorial. nao consegui fazer meu boneco andar. a versao do meu é 4.6.2f1. Apos colocar o script no player na aba inspector, nao aparece a opcao velocidade. Ao final aparece o seguinte: all compiler errors have to be fixed before you can enter playmode!

  34. Na Aba Console, ele normalmente informa a linha do erro. Verifica qual é, pode estar faltando alguma coisa, como animator, aspas, chaves, ponto e virgula.

  35. rivastech disse:

    refiz todas as etapas até para ir percebendo esse tipo de coisa. mas continua apresentando este erro. Uma coisa que acho estranho é quando eu vou no hierarchy e marco Player para clicar em add componet não tem a opcao script para buscar o que foi digitado e sim new script.

  36. rivastech disse:

    outra coisa -> Assets/scripts/Player.cs(21,19): error CS1547: keyword ‘ void ‘ cannot be used in ths context

  37. rivastech disse:

    Refiz alguns passos, e agora saiu a mensagem, mas não consegui ver o que fiz errado.

  38. jonathanalis disse:

    Na parte de andar pro lado, tem um deltaTime para que o personagem não ande mais ou menos dependendo do pc de quem tá jogando.
    Mas no pulo não tem isso. Pq?
    Se a pessoa jogar num PC mais rápido, pode pular mais alto?

    BTW, belo tutorial!

  39. Primeiro é bom lembrar o que deltaTime faz. Ele é o tempo do ultimo frame para o atual. Só que no caso do pulo, a força aplica ao pulo não é continua. Acontece apenas uma vez por pulo (Um único frame assim digamos). Logo não tem problema um pc rodar mais rápido do que o outro.

    Se colocar o deltaTime nessa situação, teria efeito contrário. Uns pc’s o pulo seria maior do que outros, já que não é um movimento continuo.

  40. rivastech disse:

    os tutoriais são muito bons, ainda nao mandei meu arquivo. antes queria tirar uma duvida mais ampla. afinal estou fazendo 3 projetos em paralelo para ir compreendendo melhor o que está sendo feito (achei melhor assim). uma duvida surgiu, pq o hierarchy ficou vazio? sendo que só fechei o projeto ontem e reabri hoje? tendo salvo tudo. Em relacao a isso, como o unity salva seus arquivos?

  41. Os conteúdos da aba hierarchy eles ficam salva na cena. (File >> Save Scene).

    Para exibir eles de novo, basta procurar a cena salva na aba Project. Dá dois cliques e tudo volta ^^

    Quanto tem mais de uma cena, você pode altera-las desta forma também.

    O Unity salva todos os seus arquivos igualzinho a aba Project. Se você abrir a pasta do seu projeto vai ver uma pasta chamada Assets. É onde tudo que você criou está.

  42. rivastech disse:

    mt bom, obrigado.

  43. Pedro Souza disse:

    ótimos posts, está realmente me ajudando muito. Mas quando eu aperto o espaço várias vezes ele continua pulando. Mesmo após eu colocar o verificador. Pode me ajudar?

  44. wilson disse:

    não consigo usar o
    rigidbody2D.AddForce(transform.up * forcaPulo);
    o unity diz e ele é obsoleto
    oque eu poderia usar no lugar dele?

  45. Se está obsoleto deve ser por conta de alguma atualização do Unity.

    A ultima atualização que eu vi mudou muita coisa. Da uma buscada no google por rigidbody2D AddForce obsolete

    No momento eu estou afastado do site

  46. Pedro Souza, verifica se no if está verificando se o personagem está no chão mesmo ou não e se a variavel chao fica desmarcada (false) quando seu personagem está pulando.

  47. Guilherme disse:

    Olá, estou gostando muito do seu tutorial, mas estou com problemas para realizar os pulos do personagem. la no if (Input.GetButtonDown(“Jump”) && estaNoChao) {
    rigidbody2D.AddForce(transform.up * forcaPulo);
    }
    no meu script não existe o atributo rigidbody2d não aparece para mim.
    então eu tive que fazer dessa forma
    if (Input.GetButtonDown(“Jump”)&& estaNoChao) {
    transform.Translate (Vector2.up * forcaPulo * Time.deltaTime);
    mas com isso ele pula numa altura aleatoria. se poder me ajudar eu estou usando o unity 5

  48. renanfernandesdecastro disse:

    No Unity 5:
    GetComponent().AddForce(transform.up * forcapulo);

  49. bom no meu unity 5 tds os metodos alternativos resultaram no erro de execucao alguem me poder dar outro metodo alternativo
    if (Input.GetButtonDown(“Jump”) && estaNoChao) {
    GetComponent().AddForce(transform.up * forcaPulo);

    • Leonardo Alves disse:

      Amigo, me desculpa mas ficará um tempo sem resposta, no momento o responsável pelo post e criador do site está afastado por motivos pessoais, então demos uma pausa nos tutoriais Unity. 🙁

      vide aqui a postagem do afastamento dele
      http://jogosindie.com/despedida/

      Até mais 🙂

  50. thomas barros disse:

    to com problemas me ajuda por favorr aki esta meu escript completo
    using UnityEngine;
    using System.Collections;

    public class Player : MonoBehaviour {

    public float velocidade;

    // Use this for initialization
    void Start () {

    }

    // Update is called once per frame
    void Update () {
    Movimentacao();
    }
    void Movimentacao() {
    if (Input.GetAxisRaw((“Horizontal”) > 0 ) {
    transform.Translate (Vector2.right * velocidade * Time.deltaTime);
    transform.eulerAngles = new Vector2(0, 0);
    }
    }
    }
    aki esta o erro Failed to create device file:
    1f Um dispositivo conectado ao sistema não está funcionando.

    nao aparece velocidade la na opcao do script igual o da sua imagem o meu so aparece scripe name e so… me ajuda por favor

  51. João Marques disse:

    Amigo, você colocou 2 parênteses no início do “Horizontal”. É apenas 1.

    Segue o código corrigido:
    using UnityEngine;
    using System.Collections;
    public class Player : MonoBehaviour {
    public float velocidade;
    // Use this for initialization
    void Start () {
    }
    // Update is called once per frame
    void Update () {
    Movimentacao();
    }
    void Movimentacao() {
    if (Input.GetAxisRaw(“Horizontal”) > 0 ) {
    transform.Translate (Vector2.right * velocidade * Time.deltaTime);
    transform.eulerAngles = new Vector2(0, 0);
    }
    }
    }

    OBS: Não entendo muita coisa do Unity, mais sou desenvolvedor C#, então a parte do código é moleza.. no que eu puder ajudar to ai

  52. nosrevied disse:

    Tive esse problema por que estou usando a versão 5 do Unity, precisei fazer dessa forma:
    GetComponent().AddForce(transform.up * forcaPulo);

  53. nosrevied disse:

    Cara, tenta isso:
    GetComponent().AddForce(transform.up * forcaPulo);

    No Unity 5 da outro pau la na frente, o animator fica doidão, você parado ele fica dando loop infinito, testei o mesmo codigo e no 4 passou liso, esquece tentar fazer no Unity 5, faça no 4 pelo menos para completar o tutorial, eu comecei a fazer no 4, inventei de ir para o 5, deu alguns problemas, estou voltando para o 4.

  54. Iara disse:

    Ótimo tutorial… tenho tentado fazer algumas pequenas modificações no script e tem dado super certo… como poderia fazer para o personagem girar para esquerda e direita sem sair do lugar? Dá para fazer isso usando as setas horizontal e vertical ou é necessário usar outra tecla para esse movimento?

  55. Então Lara, eu meio que vou sumir até o dia 15, então caso você comente algo e eu não responda é porque estou focado em uns trabalhos que tenho que fazer com prazo super apertado.

    Quanto a sua dúvida dá sim para fazer, se seu personagem não andar, basta remover o transform.Translate. Agora se você quiser um botão para virar e outro para andar, ai sim terá que fazer isso mesmo que você falou. Usar botões para cada ação. Senão me falha na parte de ataques especiais do personagem eu expliquei como “criar” novos botões ^^

  56. Opa, Jesiel, na verdade, na nossa versão do Unity, não aparece isso mesmo, você pode resolver de 2 maneiras:

    a 1ª é você adicionar um novo script C# lá pelo add component >> new script. Deixe o nome e crie, depois, quando o componente aparecer, você troca o campo Script para o que você quer colocar (o que já foi criado).

    A 2ª maneira é clicar no script na pasta Scripts na aba Project e arrastar até o Player. ATENÇÃO, você deve “soltar” o script SOBRE o player, não dentro dele, senão ficará aninhado como um subitem do player, você soltando sobre ele, o unity entende a atribuição que você quer fazer.

    Espero ter ajudado!

  57. Pessoal, pra quem teve problemas com o Unity 5.0, na parte de fazer o “pulo” do personagem, quando o compilador avisava ou que a função era obsoleta ou que era necessária a referência do objeto instanciado, segue a solução.

    troque o método de pulo por:

    if (Input.GetButtonDown (“Jump”)) {
    GetComponent().AddForce(transform.up * forcaPulo);
    }

    Aqui funcionou dessa forma, não me perguntem como fiz isso, tava quebrando a cabeça aqui, minimizei o MonoDeveloper, mexi em outras coisas, quando voltei no Mono tinha um aviso que alteração por fora do editor, se eu queria dar load nelas, apareceu isso aí, eu deixei e funcionou kkkkkkkkkk

  58. carloswgama disse:

    Valeu pelo apoio ao pessoal Allexandre ^^

  59. Carloswgama
    Quê isso amigo, eu que agradeço pelo tutorial!
    Estou seguindo aqui o passo-a-passo, porém uso a versão 5.0 do Unity, sempre que notar alguma diferença ou conseguir resolver algum problema que tive, vou vendo aqui o pessoal que também teve o problema e ajudo!
    Vlw!

  60. Adadezer disse:

    Olá! Parabéns pelo tutorial, muito bom ele, e aos amigos q estão comentando, ler os comentários d vcs comentando os bugs ajuda muito

    Tive problemas na parte do pulo tbm, tentei colocar o código q o Allexandre postou mas tbm não funcionou.
    Essas outras coisas q vc mexeu foi aonde? rsrs

    Vlw!

  61. Gustavo Henrique disse:

    Olá, ótimo tutorial, mas eu tive problemas na parte do pulo do jeito que foi apresentado no tutorial, fala que é necessário uma referencia de objeto para o campo, teria como me ajudar?

    Desde já agradeço!

  62. Gustavo Henrique disse:

    Não é mais necessário, já consegui arrumar 😀

  63. Marcelo disse:

    no meu script fica dando erro na hora que eu vo dar o play esse erro aqui
    All compiler errors have to be fixed before you can enter playmode!
    UnityEditor.SceneView:ShowCompileErrorNotification()
    o q é isso pode me ajudar?

  64. Matheus2030 disse:

    Olá, fiz o tutorial, me animei e agora estou fazendo um joguinho parecido, dessa vez o player joga com uma bolinha, e bom, a bolinha não roda =|, eu desmarquei a opção fixed angle mas nada, pode me ajudar?

  65. carloswgama disse:

    Então Gustavo, perdão a demora. Isso ai de referênciar objeto é provavelmente porque você não selecionou qual o objeto é que será usado no script.

  66. carloswgama disse:

    Marcelo ele deve ter mais informações de qual o script e a linha que está apresentando o erro. Dá uma olhada lá no Console e ver se encontra 😉

  67. carloswgama disse:

    Opa Matheus.

    Cara, se a sua bola não roda verifica esses pontos:
    – Está com um CIRCLE Collider 2D (Se tiver com o quadrado, fica ruim rodar)
    – Na versão 5.0 existe no Rigidbody2D uma opção Freezing Rotation. Desmarca os eixo X que acho que resolve.
    – Tenta também diminuir a massa do objeto no Rigidbody2D, ela pode estar muito pesada e não sendo impossível empurrar.

  68. Matheus2030 disse:

    Caramba cara, valeu mesmo!!!

  69. Breno B. disse:

    Galera na hora de fazer o pulo da erro por causa do Addforce como resolve?

  70. Mastermuuu - AJUDA!!! disse:

    eu baixei a ultima versão no site, licença gratuita, porém essa linha de código movimentação sempre dá errado aqui – mesmo seguindo e revisando todos os passos, sempre mesmo; já tentei de muitas maneiras, o que eu faço ?

  71. Pra quem está usando o Unity 5.x pra fazer o tutorial e estiver tendo problemas com o personagem não pular basta fazer o seguinte:

    – Selecione o objeto chaoVerificador
    – Arraste-o para dentro de ‘heroi_sprite’

  72. Murilo disse:

    Carlos eu que estava fazendo errado, deixei o Personagem fora do Player; já resolvi o problema, porém não consigo fazer com que o meu Player Pule(Jump), não dá erro algum, porém eu não consigo testar o jogo, se tiver como me ajudar nessa parte eu agradeço!

    • Murilo, faz o seguinte então. Não tem a variável estaNoChao? Ela é private, troca ela para public e verifica se ela ficar marcada (ativa) lá no Unity, quando o personagem está no chão.

      Se ela não fica marcada significa que (possibilidades):
      1 – A distancia do chaoVerificador e do Player está pequena
      2 – O seu objeto chão não está com o layer Piso (Não confundir com Tag)
      3 – a forma como o Piso está escrito lá no Unity está diferente do código (piso é diferente de Piso, letras maiúsculas contam)
      4 – Algum possível erro no código

      Se ela aparecer, verifique se o está realmente usando o botão “Jump” (Input.GetButtonDown(“Jump”)), que é a tecla espaço.

      Se não for nenhum dos dois, copia teu código em algum canto e manda para mim, para eu dá uma olhada nele 😉

  73. gabriel disse:

    Olá, tenho um problema quando giro o sprite com transform.eulerAngles ele ainda continua a andar pra direita mas quando tiro o 180 graus ele anda pra esquerda o codigo é esse….

    using UnityEngine;
    using System.Collections;

    public class Player : MonoBehaviour {

    public float velocidade;
    public float pulo;
    private bool estanochao;
    public Transform Chaoverificador;

    // Use this for initialization
    void Start () {

    }

    // Update is called once per frame
    void Update () {
    Movimentacao();
    }

    void Movimentacao() {

    estanochao = Physics2D.Linecast (transform.position, Chaoverificador.position, 1 < 0 ) {
    transform.Translate (Vector2.right * velocidade * Time.deltaTime);
    transform.eulerAngles = new Vector2(0, 0);
    }

    if (Input.GetAxisRaw(“Horizontal”) < 0 ) {
    transform.Translate (-Vector2.right * velocidade * Time.deltaTime);
    transform.eulerAngles = new Vector2(0, 180);
    }

    if (Input.GetButtonDown ("Jump") && estanochao) {
    GetComponent().AddForce(transform.up * pulo);
    }
    }
    }

    Unity Version 5.2.1f1

    Obrigado^^

  74. gabriel disse:

    É pulei o script mesmo mas agora deu certo e valeu^^
    e obrigado pelos tutoriais^^

  75. Daniel Santos disse:

    E aí carlos, to inciando com unity agora, tava vendo uns vídeos em inglês no site do unity, até que encontrei seu site, muito bem explicado, ótimos posts=D, parabéns! Aproveitando, to com um probleminha, o tamanho do meu chão verificador é bem pequeno, assim se o meu player estiver na ponta de um bloco, por exemplo ele não pula, tento alterar o tamanho dele e não funciona, sabe se tem como ? rsrsrs.

  76. Daniel Santos disse:

    Pois é, aí que ta o negócio, o tamanho do ícone não importa, antes eu tinha colocado só “chao” aí o ícone tava minúsculo, coloquei o nome maior, o ícone cresceu, mas é como se não tivesse colisão, e ele não aumenta alterando o scale(x). O seu pula normal, mesmo quando está bem na pontinha dos itens da layer “Piso” ? Acho isso bem importante, e não funcionou essa parte aqui, acho que só isso mesmo.

  77. Davi Zucas disse:

    Valeu cara, tava precisando disso!

  78. Davi Zucas disse:

    Carlos, empaquei aqui.

    using UnityEngine;
    using System.Collections;

    public class Player : MonoBehaviour
    {

    public float velocidade;
    public float forcaPulo;
    public bool estaNoChao;
    public Transform chaoVerificador;

    // Use this for initializationjeneci
    void Start()
    {

    }

    // Update is called once per frame
    void Update()
    {
    Movimentacao();
    }

    void Movimentacao()
    {

    estaNoChao = Physics2D.Linecast(transform.position, chaoVerificador.position, 1 < 0)
    {
    transform.Translate(Vector2.right * velocidade * Time.deltaTime);
    transform.eulerAngles = new Vector2(0, 0);
    }

    if (Input.GetAxisRaw(“Horizontal”) < 0)
    {
    transform.Translate(Vector2.right * velocidade * Time.deltaTime);
    transform.eulerAngles = new Vector2(0, 180);
    }

    if (Input.GetButtonDown("Jump") && estaNoChao)
    {
    GetComponent().AddForce(transform.up * forcaPulo);
    }
    }
    }

    Esse é o código (unity5) e ele n reconhece qdo o personagem está no chão, eu tentei aumentar a distancia do chaoVerificador, eu verifiquei a grafia do Layer no codigo e mesmo assim nada.

  79. Davi Zucas disse:

    Dei uma relida e tinha esquecido de passar o chao pro PISO.. vlw 0/ 0/ 0/

    • E no script dá uma olhada nessa linha:

      estaNoChao = Physics2D.Linecast(transform.position, chaoVerificador.position, 1 << LayerMask.NameToLayer(“Piso”));

      No seu está 1 < 0

      ^^

  80. felipe disse:

    Essa dica ai do chaoVerificador muito proximo do personagem; é muito útil. Eu fiquei semanas quebrando a cabeça por causa disso. . . VLW mesmo.

  81. Alexandre disse:

    Quando adicionei o chaoVerificador no código não consigo mais pular no teste do game. Segue imagem da unity e do código.
    http://imgur.com/tcPf0VD
    http://imgur.com/StNCN1C

    • e ai, Alexandre, tudo joia?

      Então, eu tenho uma suspeita. Verifica se o seu objeto “chadoVerificador” está realmente utilizando a Layer “Piso”.

      Se tiver e ainda sim der erro, troca no seu script o tipo private para public do chaoVerificador e roda o jogo. Quando rodar o jogo, verifica se o checkbox Chao Verificador vai estar marcado!

      OBS: Tente sempre deixar seu código bem indentado (Alinhado). O “}” final do if com o mesmo recuo do if, os métodos tudo iniciando na mesma distancia e essas coisas ^^

      Meus primeiros códigos quando eu vou olhar também não eram tão lindos, mas acredite isso é algo que tu se acostuma rápido e deixa seu código muito mais legível e de fácil manutenção

  82. Alexandre disse:

    Valeu pela dica da arrumação ! o checkbox não fica marcado quando roda o jogo

  83. Alexandre disse:

    o checkbox continua não sendo marcado quando roda o jogo

  84. Alexandre disse:

    Mandei lá ,Carlos. Obrigado pela atenção e pelas respostas rápidas 🙂

  85. Mauricio disse:

    Incrível, pena que acabou T-T

  86. maico disse:

    muito bom o tutorial bem explicado!

  87. Olá! Excelente Site e Tutoriais! =)

    Gostaria de saber como colocar rotação quando andamos na Vertical (pela tecla W,S) para o personagem andar pra cima e para baixo normalmente (visualizando as costas e a frente do mesmo).
    Estou querendo fazer um jogo estilo Zelda: The Hylures of Fantasy e The Adventure of Link.

    Meu Script:

    using UnityEngine;
    using System.Collections;

    public class PlayerController : MonoBehaviour {

    public float velocidade;

    void Start () {

    }

    void Update () {

    Movimentacao ();
    }

    void Movimentacao() {

    if (Input.GetAxisRaw (“Horizontal”) > 0) {
    transform.Translate (Vector2.right * velocidade * Time.deltaTime);
    transform.eulerAngles = new Vector2 (0, 0);
    }
    else if (Input.GetAxisRaw (“Horizontal”) < 0) {
    transform.Translate (Vector2.right * velocidade * Time.deltaTime);
    transform.eulerAngles = new Vector2 (0, 180);
    }
    else if (Input.GetKey ("w")) {
    transform.Translate (Vector2.up * velocidade * Time.deltaTime);
    }
    else if (Input.GetKey ("s")) {
    transform.Translate (Vector2.down * velocidade * Time.deltaTime);
    }

    else if (Input.GetKey(KeyCode.UpArrow))
    {
    transform.Translate(Vector2.up * velocidade * Time.deltaTime);
    }
    else if (Input.GetKey(KeyCode.DownArrow))
    {
    transform.Translate(Vector2.down * velocidade * Time.deltaTime);
    }

    }
    }

    Agradeço a atenção! =)

    • Cara então, nessa ocasião eu faria uma variável do tipo inteira, para armazenar a direção e depois jogaria esse valor no animator. Exemplo:

      private int direcao = 3; //1 – cima | 2 – direita | 3 – baixo | 4 esquerda

      //Direita
      if (Input.GetAxisRaw(“Horizontal”) > 0) {
      direcao = 2;
      transform.Translate(Vector3.right * velocidade * Time.deltaTime);
      }

      //Esquerda
      if (Input.GetAxisRaw(“Horizontal”) < 0) { direcao = 4; transform.Translate(-Vector3.right * velocidade * Time.deltaTime); } //Cima if (Input.GetAxisRaw(“Vertical”) > 0) {
      direcao = 1;
      transform.Translate(Vector3.up * velocidade * Time.deltaTime);
      }

      //Baixo
      if (Input.GetAxisRaw(“Vertical”) < 0) { direcao = 3; transform.Translate(-Vector3.up * velocidade * Time.deltaTime); } //Informa para o animator trocar a animação da direção do personagem animator.setInteger(“direcao”, direcao); --- Agora cabe a você ver se essa engine é a mais indicada para o que você quer, pois o RPG Maker tem essa funcionalidade nativa sem precisar programar nem nada.

      • Eu já fui do RPG Maker há uns anos atrás. Queria uma evolução pra Unity (2D,3D) ^^.
        Coloquei esse script no lugar do meu e ta dando esse erro:
        Assets/Scripts/PlayerController.cs(47,29): error CS0117: `UnityEngine.Animator’ does not contain a definition for `setInteger’

        Como resolver?

          • Já troquei =)

            using UnityEngine;
            using System.Collections;

            public class PlayerController : MonoBehaviour {

            public float velocidade;
            private int direcao = 4; //1 – cima | 2 – direita | 3 – baixo | 4 esquerda
            public void SetInteger(direcao, direcao);

            void Start () {

            }

            void Update () {

            Movimentacao ();

            }
            void Movimentacao() {

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

            • Mesmo colocando: public void SetInteger(direcao, direcao); da o mesmo erro.

              • Dei uma modificada no código e ta dando esse erro:

                Assets/Scripts/PlayerController.cs(49,26): error CS0120: An object reference is required to access non-static member `UnityEngine.Animator.SetInteger(string, int)’

                • Digamos que penas o método movimento que iria mudar, o resto continuaria igual.
                  Ali você declarou o método SetInteger(direcao, direcao), como uma variável. Pode remover, ela é um método do Animator. E no caso, precisa dizer quem é o animator, então seu código seria algo como assim:

                  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

                  void Start () {
                  animator = GetComponent<Animator>(); //Pega o Animator do objeto que também possui esse script, que acredito ser o mesmo

                  }

                  void Update () {
                  Movimentacao ();
                  }
                  void Movimentacao() {

                  //Direita
                  if (Input.GetAxisRaw(“Horizontal”) > 0) {
                  direcao = 2;
                  transform.Translate(Vector3.right * velocidade * Time.deltaTime);
                  }
                  //Esquerda
                  if (Input.GetAxisRaw(“Horizontal”) < 0) {
                  direcao = 4;
                  transform.Translate(Vector3.up * velocidade * Time.deltaTime);
                  }

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

                  //Baixo
                  if (Input.GetAxisRaw(“Vertical”) < 0) {
                  direcao = 3;
                  transform.Translate(-Vector3.up * velocidade * Time.deltaTime);
                  }

                  //Informa para o animator trocar a animação da direção do personagem
                  animator.SetInteger(“direcao”, direcao); //aqui o animator é minusculo, pois é a variavel animator que estamos acessando e não a classe Animator ^^
                  }
                  }

                  • Agora está dando esse erro:

                    Assets/Scripts/PlayerController.cs(12,28): error CS0411: The type arguments for method `UnityEngine.Component.GetComponent()’ cannot be inferred from the usage. Try specifying the type arguments explicitly

                    =/

                    • ue, mas seu personagem não está se movendo agora para cima, para baixo, esquerda e direita? Então não tem o pulo implementado ai O.o

                      Quando a esse erro, troca aquela linha pro essa:
                      animator = GetComponent() as Animator;

                      Adicionado o as Animator no final.

                      Quanto a minha sugestão é primeiro tentar essa o jogo do tutorial que é mais simples do que o que você quer. Para aprender melhor o que é um método, uma classe, variáveis e para que serve cada coisa.

                      Ai quando tiver a base, você vai tentando novas coisas, do contrário você vai terminar não sabendo do porque está fazendo certas coisas. Não é um problema começar do básico ^^, faz parte do aprendizado e torna o caminho mais fácil.

                  • Continua o mesmo erro. =/
                    Eu sei, começar do basicao xD.. Mas n to querendo criar um jogo direto, e sim pegar algumas partes e montar para entender como funciona =) (De pedaço em pedaço).

                    • Onde está o jogo do tutorial?

                    • Ele está nesse link:
                      Índice

                      Porém no Chrome já não abre mais a versão web. Mas se tentar pelo firefox, acho que ainda consegue abrir.

                    • Erro meu -.-‘, esqueci que quando digito normalmente o < e >, ele considera uma tag html e a oculta. tem que usar em forma de código para aparecer.

                      Agora sim:
                      animator = GetComponent<Animator>() as Animator;

                    • Agora foi! Mas deu outro erro.. Está dizendo que o parâmetro direcao não existe. ‘0’
                      Eu teria que mudar o parâmetro da animação para direcao?

                      Parameter ‘direcao’ does not exist.
                      UnityEngine.Animator:SetInteger(String, Int32)
                      PlayerController:Movimentacao() (at Assets/Scripts/PlayerController.cs:50)
                      PlayerController:Update() (at Assets/Scripts/PlayerController.cs:18)

                    • Não, neste caso eu recomendo tu continuar o tutorial, pois isso conteúdo de outro post, o de animação, por isso que recomendo primeiro fazer o básico para entender o que é cada coisa para depois ir alterando ^^

                    • Eu fiz um comentário de dúvida la no tutorial de animação. Se quiser dar uma força la! =)

  88. Guilherme Barbosa disse:

    Boa tarde Carlos amei muito seus tutoriais esta me ajudando muito , mas eu tenho duas duvidas eu sou novato em desenvolver games indies e gostaria de dicas. ><
    como organizar o projeto ?
    qual programação e melhor C# ou javascript ? ( essa seria a minha duvida maior )

    • e aê guilherme, tudo joia? Então não existe exatamente uma regra de pasta em si. Cada pessoa tem um modelo. Mas é sempre bom separar os conteúdos pelos tipos ou seja crias pastas como:
      Script
      Prefabs
      Sprites
      Textures
      Scenes
      Sounds
      – BGM – Músicas de fundo
      – BGS – Sons de fundos contínuos como vento, grilos…
      – SE – Sons de efeitos como ataques

      Mas isso é algo que você vai criando um padrão seu baseado no que você vai vendo e usando, então pode relaxar.

      Quanto a linguagem tem o C# e o Javascript como os mais conhecidos. Em questão de qualidade, eu recomendo o C#, pois o Javascript é uma linguagem mais simples, por isso mais fraca. O JavaScript até tem uma tentativa de Orientador a Objeto, mas muito fraco, por isso C# ^^

  89. Fabio Martim disse:

    Carlos, td bem?…
    bom comecei a seguir seus tutoriais e resolvi começar do tutorial básico, sendo assim baixei a versão 4.6, fiz o script de movimentação mas hora que aperto o A para ele ir para trás, a plataforma simplesmente desaparece, sabe o que pode ser?

    • Isso tem cheiro de camera.

      Você colocou a camera como sendo filha do Player? Se colocou, basta remover. Mais na frente tem um script que mostra como fazer isso de forma correta ^^

  90. Fabio Martim disse:

    Nao esta como filha nao…:/

    • Curioso… muito curioso.

      O personagem não cai e ela não desaparece da aba Hierarchy correto? Apenas a imagem que desaparece?

      Isso tem muito cara de camera. Olha a posição de Z na aba Inspector e ver se o chão se move. A camera normalmente fica na posição -10 e alcança até mais ou menos acho que -5. Se o chão tiver além de -5, tipo -7, ele poderá já não mais estar no alcance da camera.

  91. Fabio Martim disse:

    Achei o erro…n sei pq raios o script do player estava no chao…ai dava esse erro…removi…resolveu…vlw soh achei o erro pq vc falou pra olha n aba hierarchy…vlw

  92. Aleksander.ss disse:

    Carlos W. Gama
    não estou conseguindo colocar o meu “player script” no meu Player ….unity vs.5

  93. Aleksander.ss disse:

    descobri o que era! o nome Player não ficou automaticamente escrito no plublic class….
    estava new”alguma coisa” dai eu coloquei Player e funcionou….
    acho que vc não entendeu… mas obrigado pelo tutorial.

  94. WanGo's Lain disse:

    Olá.
    Ótimo tutorial!

    Teria como me dizer qual script usar para o personagem ‘voar’, seguindo o mouse?

    Agradeço (já procurei muito e não achei um script para fazer isso).

    • Nesse caso você pode pegar a posição do mouse na tela com o Input.mousePosition (Não é a posição na cena e sim na tela) e converter essa posição da tela para a posição na cena com o camera.ScreenToWorldPoint. Seu script seria mais ou menos assim:

      //Define a velocidade que o objeto irá voar
      var velocidade = 2f;

      //Busca o script da câmera
      var camera = FindObjectOfType<Camera>();

      //Pega a posição do mouse na cena
      var destino = camera. ScreenToWorldPoint(Input.mousePosition);

      //Move Objeto para posição do mouse (Usamos o Lerp par ao movimento ser mais suave já que está voando)
      transform.position = Vector3.Lerp(transform.position, destino, velocidade * Time.deltaTime);

  95. Lucas disse:

    Bom dia Carlos

    Meu personagem não pula.
    Eu tava lendo nos comentarios pra ver se havia mais alguem com esse problema, e vi umas soluções, eu apaguei o && estaNoChao e pula, mas quando escrevo de novo o personagem não pula mais.

    • Bom, Lucas, neste caso o problema está no chaoVerificador mesmo.

      1 – Verifica se o seu está realmente a layer Piso
      2 – Verificar se o nome da Layer no chao é igual ao nome no LayerMask.NameToLayer(“Piso”);
      3 – Verificar se o objeto chaoVerificador está um pouco distante do Player, de forma que entre eles exista um objeto com a Layer Piso 😉

  96. Guilherme Ribeiro Martins disse:

    Estou com um projeto de RPG 2D como faço para o personagem mover na vertical e horizontal?

  97. lucas mattei disse:

    Ola o meu da um erro na primeira parte de fazer o script da direita:
    Assets/Scripts/PlayerBehaviour.cs(15,33): error CS1547: Keyword `void’ cannot be used in this context
    ja peguei o seu script pronto deu a mesma coisa se puder ajudar agradeço

    • Então luz, bora lá entender.

      Quando apresenta um erro assim os números ali 15 e 33 representam a linha e a posição do texto (coluna).

      Então você está tendo um erro no script na linha 15 e na coluna 33. O seu script de alguma forma está diferente o meu (até mesmo o nome), então se você puder copiar ele em algum canto e me mostrar ou até mesmo enviar para o meu e-mail eu posso ver melhor.

      Mas ai vai meus palpites. Deve está faltando uma “}” ou “;” na linha de cima. O void ali usado acredito que esteja no inicio de um método, então o método de cima que não deve ter sido finalizado corretamente.

  98. Everton disse:

    Quando o personagem pula ele afunda um pouco no chão, atravessando um pouco a linha da caixa de colisão, antes de ficar acima da linha.

  99. Deliora Play disse:

    CARA ME AJUDA PELO AMOR DE JESUS!!!! N tava conseguindo pular, aí fui olhar nos comentários e o Jhonatan Cavalcanti tava com o mesmo problema, vc mandou ele deletar o “&& estaNoChao”, eu fiz isso e o meu herói realmente pulou… Só q ele n tem um limite de pular!! Se eu apertar 3 vezes a barra de espaço ele da um pulo normal e 2 no ar e vai lá pro 5º dos infernos velho. Como faço pra limitar esses pulos

    • Deliora Play disse:

      E eu jáh fiz isso, q vc escreveu para “Lucas” um pouco acima:

      1 – Verifica se o seu está realmente a layer Piso
      2 – Verificar se o nome da Layer no chao é igual ao nome no LayerMask.NameToLayer(“Piso”);
      3 – Verificar se o objeto chaoVerificador está um pouco distante do Player, de forma que entre eles exista um objeto com a Layer Piso ?

      Estava tudo certo e ainda ta com o mesmo problema. Se eu boto o “&& estaNoChao” n pula, se eu tiro o “&& estaNoChao” ele voa… Me ajuda Carlos pfff

      • Calma, calma, calma.

        Bom, se você retirou o estaNoChao e ele está pulando, significa que é uma falha na configuração do piso, chaoVerificador e o script, como citei aqueles 3 exemplos acima.

        Tem como me enviar um print da tela do Unity mostrando o chaoVerificador e o seu piso?
        E se possível também copia um trecho do código responsável por gerar o chaoVerificador, aquele Physics2D.Linecast

  100. Deliora Play disse:

    Kra aconteceu uma coisa muito chata: Eu tava tentando resolver sozinho o problema, antes de ver que você tinha respondido meu comentário, só que o Unity crashou, o pc travou, tive q reiniciar. Qndo voltou tudo tinha sumido… Só que consegui fazer tudo de novo rapidinho e dessa vez funcionou. To Na parte 5 do tutorial man… VLW VLW VLW VLW

  101. Beatriz disse:

    O AddForce n pega. O que eu faço?

    • Na versão 5, algumas coisas mudaram ^^

      Esse tutorial foi feito na versão 4 em 2014.
      Para acessar o AddForce, você agora tem que buscar o Rigidbody2D:

      GetComponent<Rigidbody2D>().AddForce(valorDaForca);

  102. Felipe disse:

    Boa noite .

    Estou com um erro quando no tento verificar se o Player está no chão .

    estaNoChao = Physics2D.Linecast (transform.position, chaoVerificador.position, 1 << LayerMask.LayerToName("Piso"));

    error CS1502: The best overloaded method match for `UnityEngine.LayerMask.LayerToName(int)' has some invalid arguments .

  103. Clara disse:

    oi vc pode da uma forca, to fazendo um outro projeto e quando eu crio o gameobject nao aparece as setas so um circulo meio q transparente que nao da pra pegar. isso somente no 2D, quando udo para o 3d ele aparece. como faço para arrumar?

    • Opa Clara.

      Não tem aqueles 5 primeiros botões que ficam embaixo do menu do topo?

      A mãozinha, as setinhas em 4 sentidos, duas setinhas como se fosse atualizar e as setinhas diagonais e o quadrado?

      Acredito que seja isso que você quer.

      A mãozinha, move a Scene, sem mover os objetos.
      As 4 setas no sentido Norte, Sul, Leste, Oeste, move o objeto na scene
      As 2 setas com cara de atualizar, rotaciona o objeto (acredito que é o que está selecionado)
      As 4 setas diagonais, muda a escala do objeto
      O quadrado, muda a escala do objeto de uma forma mais pratica.

      Tenta selecionar o segundo botão dali.

  104. Anderson disse:

    Meu camarada quando aperto Play meu personagem não para de pular

    • Opa Anderson, enta isso aqui:

      Possibilidade:

      1 – Aumentar a distância do objeto chaoVerificador do Player (Pode ser que a distância esteja pequena e por isso não chega a ter um chão entre os dois)

      2 – Clica no Objeto Chao e verifica ali na Inspector (Aquela onde, a gente ver a posição, scripts, componentes e essas coisas). E verifica se ele está com o Layer “Piso”

      Ali onde está a setinha do Layer, tem que estar “Piso”

  105. Obrigador pela atenção rápida..:)
    Então eu já havia conferido isso,e portanto nada mudou..o meu personagem quando aperto o Play fica pulando sem eu apertar a tecla espace, a animação que eu coloquei como primaria seria a parada,mais já começa com ele pulando no lugar,mecho as setas ele vira para direita e esquerda,no mesmo lugar,porém sempre pulando

    • Então,

      esse problema ai está relacionado a variavel estaNoChao, que provavelmente está como falsa (Pode deixar ela como pública e verificar no Inspector do Unity).

      Agora que tem que o que está causando. Se faltou por o if, se o nome da Layer está diferente do script, se o objeto que verificar a distancia do chão nao está selecionado corretamente, se há um espaçamento legal entre o player e o chaoVerificador.

  106. Beleza vou olhar aqui 🙂 ,só mais uma coisa que esqueci de comentar, quando eu inverto em conditions true e false ele para de pular, e os outros comandos voltam,porém ,quando aperto o botão ele não pula.

  107. Eu estou usando o Pc do trabalho para postar aqui..kkk o meu notebook está sem internet ,amanhã quando eu chegar eu vou postar,porém quando adicionei um box collider e edit collider no chão om personagem parou de ficar pulando direto,mais ainda não responde quando aperto o botão

  108. Anderson disse:

    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") )
    {
    GetComponent().AddForce(transform.up * forcaPulo * Time.deltaTime);

    • No caso nesse script falta por o estaNochao dentro do if:

      if (Input.GetButtonDown(“Jump”) && estaNochao)

      Do contrário a pessoa vai poder pular, mesmo não estando no chão

  109. Anderson disse:

    file:///C:/Users/VANIA%20NOVATY/Desktop/unity%20piso.PNG

  110. mandei meu camarada..adicionei script && estaNochao ele parou de pular de vez só não pula ainda quando aperto o botão..muito obrigado pelo tutorial e a atenção

    • As imagens não vi nada de errado.

      Verifica apenas se o valor estaNoChao está vindo como true ou false – Bota Debug.Log(estaNoChao). Pelo que você está falando ele deve estar vindo sempre false.

      Minhas recomendações são por o
      Debug.Log(estaNoChao);
      Debug.Log(chaoVerificador);

      e ver o que retornar esses resultados (Os valores são exibidos no Unity lá na aba Console).

  111. Retornaram assim:

    False
    UnityEngine.Debug:Log(Object)
    Player:Start() (at Assets/Script/Player.cs:21)

    chaoVerificador (UnityEngine.Transform)
    UnityEngine.Debug:Log(Object)
    Player:Start() (at Assets/Script/Player.cs:22)

    • Não vejo nenhum erro, mas sei que é alguma besteira passando despercebido pela gente. Se puder enviar o código do jogo para o meu e-mail, eu dou uma olhada mais tarde 😉

  112. Meu camarada muito obrigado..mandei o código.

  113. Eu reenviei o e-mail naquele dia mesmo…você o recebeu? mandei correto desta vez?

    • Chegou sim Anderson. 😉

      Dia de Domingo, eu quase não acesso o pc, fico pouco em casa. Amanhã a noite ou final da tarde, eu dou uma olhada, quando eu pegar em outros projetos ^^

  114. Bom dia!! To fufando aqui também para tentar resolver aquele problema do pulo ,mais enquanto não tenho progresso resolvi adicionar as animações que terminei essa semana.Mais me veio uma questão Como seria o script para fazer o player correr somente após 2 cliques na seta? e os paramentos deveriam ser bool ou float? Por enquanto ele só corre quando eu seguro as setas por determinados segundos.Outra coisa como eu consigo deixar a minha seta para cima sem função? pq com o script que coloquei para o personagem sentar ,ele também senta quando aperto para cima

  115. Avelino Alves disse:

    O meu personagem não estava pulando que nem o do Jhonathan Cavalcanti…mas verifiquei que o chaoVerificador estava “colidindo” com o sprite do meu boneco e isso fazia com que ele não efetuasse o pulo.

    É so por o chaoVerificador na mesma altura do chao onde seu personagem vai andar!

    um ótimo tutorial esse!!!

  116. Dandan disse:

    Amigo, preciso de uma ajuda!

    como faço para um objeto ter a mesma posição x de outro objeto?

    Obrigado!

  117. ednea disse:

    o meu jogo não que rodar gostaria de saber se vc poderia mim ajudar meu código esta igual só que quando eu do player nadar acontece e aparece isso: this._rigidbody.AddForce ( Vector2 (0, jumpHeight), ForceMode2D.Force); eu quero que ele ande pra frente,trais e pule.

  118. Anderson disse:

    Carlos da uma olhada no meu código,é aquele comando de duplo clique,para o personagem correr,igual no the king of figthers,pocha tudo que tento da errado..me da uma luz ..meu camarada!!

    public float velocidade;
    public float forcaPulo;
    public bool estaNochao;
    public Transform chaoVerificador;
    public Transform spritePlayer;
    private Animator animator;
    //Correr
    private bool clique2, corre1, corre2, podecorrer;
    private float tempocorrida=1 ;

    //Tudo que ocorre quando o personagem e criado
    void Start()
    {
    clique2 = animator = spritePlayer.GetComponent();
    corre1 = corre2 = false;
    podecorrer = true;

    }

    //Tudo que ocorre enquanto o personagem existe
    void Update()
    {

    Movimentacao();
    Ataque();
    Correr();
    }

    //Responsavel pelos Ataques do personagem
    void Ataque()
    {
    //Responsavel para iniciar o ataque,apertar o buton crtl e manter precionado e se for verdade começa a animação
    if (Input.GetButtonDown(“Fire1”) == true)
    {
    animator.SetFloat(“soco”, Mathf.Abs(Input.GetAxisRaw(“Fire1”)));

    }

    {
    }
    //Responsavel para terminar a ação,se soltar o botão ctrl termina a ação
    if (Input.GetButtonUp(“Fire1”) == true)
    {
    animator.SetFloat(“soco”, Mathf.Abs(Input.GetAxisRaw(“Fire1”)));

    }
    }

    //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)
    {
    GetComponent().AddForce(transform.up * forcaPulo);
    }
    //Seta no paramentro sentado, um valor menor que -1. Ira ativar a condicao para mudar de animacao
    animator.SetFloat(“sentado”, Mathf.Abs(Input.GetAxisRaw(“Vertical”)));
    //Rsponsavel por sentar
    if (Input.GetAxisRaw(“Vertical”) 0)
    {

    }

    }
    //Responsavel por correr apóis dublo clique
    void Correr()
    {
    clique2 = animator = spritePlayer.GetComponent();

    if ((corre1 == true || corre2 == true) && clique2 == true)
    corre1 = corre2 = false;

    if (Input.GetKeyDown(KeyCode.RightArrow | KeyCode.LeftArrow) && clique2 == false)
    corre1 = true;

    if (Input.GetKeyDown(KeyCode.RightArrow | KeyCode.LeftArrow) && clique2 == true && corre1 == false && corre2 == false && podecorrer == true)
    StartCoroutine(” CronometroCorrida”);
    corre1 = true;
    corre2 = false;

    if (Input.GetKeyDown(KeyCode.RightArrow | KeyCode.LeftArrow) && clique2 == false && corre1 == true && corre2 == false && podecorrer == true)

    StartCoroutine(” CronometroCorrida”);
    corre1 = true;
    corre2 = true;
    }

    IEnumerator CronometroCorrida()
    {
    podecorrer = false;
    yield return new WaitForSeconds(tempocorrida);
    podecorrer = true;
    }
    }

    • Estou surpreso. De todos os códigos que me enviaram até hoje, o teu é o que mais parece que a pessoa realmente sabia o que estava fazendo e que realmente sabe de programação (Até comparado a quem programa).

      Entretando acho que dá para fazer usar uma lógica mais simples do que um monte de condição no teu if =P

      A ideia de duas variáveis para controlar os dois cliques é boa, mas penso em fazer apenas com uma e o contador, assim eu tenho a garantia de que a pessoa apertou as duas vezes num certo período (Acho que seja o seu CronometroCorrida). Amanhã a tarde talvez esteja livre, ai monto esse script ^^

  119. Anderson disse:

    Então meu camarada..eu tive ajuda nos grupos do facebook,que me indicaram e me passaram alguns códigos como referência,porém no caso só tinham para o pulo duplo.aí eu tentei montar partir da lógica deles.Mais na realidade os créditos são deles 🙂

    • Ah entendi ^^

      Mandei pro teu e-mail o script. Fiz uma pequena limpeza em uns bugs que tinha e coisas desnecessárias e adicionei os passos para o personagem correr com dois clique. É bem simples e pequeno lá o script, não creio que terá dificuldades

  120. Anderson disse:

    Muito obrigado pela ajuda,meu camarada funcionou perfeitamente, só para estudo poderia me explicar essa parte do código?
    var velocidadeUsada = (correndo ? velocidadeCorrendo : velocidade);

    • Opa anderson. Então o velocidadeUsada será a velocidade usada na movimentação do personagem. Seja a velocidade dele andando (velocidade) ou a velocidade dele correndo (velocidadeCorrendo)

      Caso o personagem esteja correndo então correndo será true, então ele retorna o primeiro valor da expressão (velocidadeCorrendo), senão ele retorna o segundo valor da expressão (velocidade)

      Isso:
      var velocidadeUsada = (correndo ? velocidadeCorrendo : velocidade);

      Nada mais é que isso:
      var velocidadeUsada = velocidade;
      if (correndo)
      velocidadeUsada = velocidadeCorrendo

      É apenas uma outra forma mais simplificada de fazer. Mas se ficar mais fácil para você entender usando o if, não tem o menor problema.

  121. Anderson disse:

    Show de bola..entendi ..muito obrigado pela explicação 🙂

  122. Nao funciona assim aqui

  123. berthonecollins disse:

    Pra quem ta com Problemas no “Jump” fiz assim: Testem com forcapulo = 5f e vão adequando ao seu jogo aumentando ou diminuindo.

    if (Input.GetButtonDown (“Jump”)) {
    GetComponent ().AddForce (new Vector2 (0f, forcapulo));
    }

  124. Salomão Luiz disse:

    Olá, primeiramente excelente tutorial, me ajudou bastante, mas estou com uma duvida, estou planejando um jogo em que o terreno seja aberto, logo o personagem anda tanto na vertical como na horizontal, não de plataforma, eu gostaria de saber uma forma onde o personagem ande apenas na horizontal, ou apenas na vertical, um por vez, por exemplo, caso ele esteja andando para cima, e eu aperte para direita, não faça nada, ai ele só se movimente para a direita caso eu solte o botão para cima, e aperte o para direita, como ficaria o código neste caso?

    • Então Luiz, da mesma forma que você pode usar o
      if (Input.GetButton(“Horizontal”) > 0)
      transform.Translate(Vector3.right * velocidade * Time.deltaTime);
      if (Input.GetButton(“Horizontal”) < 0) transform.Translate(-Vector3.right * velocidade * Time.deltaTime);
      Você também pode usar o Vertical:
      if (Input.GetButton(“Vertical”) > 0)
      transform.Translate(Vector3.up * velocidade * Time.deltaTime);
      if (Input.GetButton(“Vertical”) < 0) transform.Translate(-Vector3.up * velocidade * Time.deltaTime);
      Para usar um comando por vez, use o “else if”

      if (Input.GetButton(“Horizontal”) > 0)
      transform.Translate(Vector3.right * velocidade * Time.deltaTime);
      else if (Input.GetButton(“Horizontal”) < 0) transform.Translate(-Vector3.right * velocidade * Time.deltaTime); else if (Input.GetButton("Vertical") > 0)
      transform.Translate(Vector3.up * velocidade * Time.deltaTime);
      else if (Input.GetButton(“Vertical”) < 0) transform.Translate(-Vector3.up * velocidade * Time.deltaTime);
      E para não ter problema com a física não use o Rigidbody2D, mas caso seja preciso usar, habilite o Is Kinematic para não sofrer efeitos de gravidade

  125. jiniriao disse:

    quando eu escrevo aparece embaixo sublinhado de vermelho e fala no error list 3 erros:

    Um espaço para nome não pode conter diretamente membros, tais como campos ou métodos

    caráter inesperado

    • Isso ocorre porque você adicionou algum caractere inválido na variável como !, ? ou “(” e “)”. Em variavel usamos apenas letras e números (Mais letras que números)

      Qual linha exatamente dá o erro, copia a linha que eu vejo

  126. jiniriao disse:

    void Movimentacao() {
    if (Input.GetAxisRaw(“Horizontal”) > 0 ) {
    transform.Translate (Vector2.right * velocidade * Time.deltaTime);
    }
    }

  127. Salomão Luiz disse:

    Sim, desse jeito eu consegui fazer, mas tipo, se ai eu aperto para cima e para a direita ao msm tempo, ele anda na diagonal, eu queria que ele andasse só nos nos eixos, horizontal e vertical apenas, existe um modo de fazer assim?

  128. jiniriao disse:

    mas quando coloco da erro

  129. jiniriao disse:

    tem como enviar uma foto para eu te mostrar o erro :

  130. jiniriao disse:

    consegui faltava {

  131. jiniriao disse:

    rigidbody2D.AddForce(transform.up * forcaPulo);
    ai tambem da erro
    Error 1 ‘UnityEngine.Component’ does not contain a definition for ‘AddForce’ and no extension method ‘AddForce’ accepting a first argument of type ‘UnityEngine.Component’ could be found (are you missing a using directive or an assembly reference?) C:\Users\Ivana\Downloads\Pile’s Adventure\Assets\scripts\Player.cs 38 29 Assembly-CSharp

    • Esse tutorial foi criado em 2014 com o Unity 4.6

      Na nova versão não se acessa mais diretamente o rigidbody2D. Tem que busca-lo através do GetComponent<Rigidbody2D>

      Ficando GetComponent<Rigidbody2D>().AddForce()

      ou

      var rigidbody2D = GetComponent<Rigidbody2D>();
      rigidbody2D.AddForce();

  132. jiniriao disse:

    envia uma foto para eu ver como e ?

  133. Salomão Luiz disse:

    O codigo que eu fiz funcionou, mas ele continua andando na diagonal, caso eu aperte dois botoes ao mesmo tempo, não existe um modo de ele andar apenas nos eixos coordenados??

  134. jiniriao disse:

    ta expirada
    a foto

  135. miranda disse:

    cara na moral vc pode me ajudar pq meu personagem não pula?

  136. Lucas Viveiros disse:

    Olá, eu coloquei o Rigidbody2D no personagem. Mas nessa parte:

    if (Input.GetButtonDown (“Jump”)) {
    rigidbody2D.AddForce(transform.up * forcaPulo);
    }

    O rigdbody2D fica riscado quando eu vou colocar e nem aparece o AddForce para colocar automaticamente já. E no Unity aparece:

    error CS1061: Type `UnityEngine.Component’ does not contain a definition for `AddForce’ and no extension method `AddForce’ of type `UnityEngine.Component’ could be found. Are you missing an assembly reference?

  137. Lucas disse:

    Cara meu unity é o 5.5.0f3 e não da, meu personagem não pula….

  138. thiago disse:

    lucas nessa versão do unity 5.5 algumas coisas mudaram

    adiciona uma nova variável do tipo private Rigidbody2d

    ex: private Rigidbody2d rb; / obs.. o “R” e maiúsculo

    agora você chama ela na void start

    ex: rb = GetComponet(); aqui você fala que a variável vai receber o Rigidbody2d

    por ultimo e só trocar

    if (Input.GetButtonDown(“Jump”) && estaNochao);{
    rb.AddForce(transform.up * forcaPulo);
    }

  139. Fenix disse:

    Meu script:

    using System.Collections.Generic;
    using UnityEngine;

    public class Movi : MonoBehaviour {

    public float velocidade;
    public float forcapulo;
    private bool estanochao;
    private Rigidbody2D rb;

    // Use this for initialization
    void Start () {

    rb = GetComponent ();

    }

    // Update is called once per frame
    void Update () {

    if (Input.GetAxisRaw (“Frente”) > 0) {
    transform.Translate (Vector2.right * velocidade * Time.deltaTime);

    }

    if (Input.GetAxisRaw (“Tras”) > 0) {
    transform.Translate (-Vector2.right * velocidade * Time.deltaTime);

    }

    if (Input.GetButtonDown (“Jump”) && estanochao) {
    rb.AddForce(transform.up*forcapulo);

    }
    }

    }

    Não quer pular de jeito nenhum 🙁

  140. Fenix disse:

    Tenta isso (Input.GetButtonDown (“Jump”)) {
    getcomponent.rigidbody2D.AddForce(transform.up * forcaPulo);

  141. Fenix disse:

    estou com o mesmo problema

  142. Rodrigo disse:

    Estou começando agr no Unity 5.5 e estou gostando bastante dos tutoriais
    Nessa parte final do pulo fiz o codigo dessa forma e deu certo:

    if (Input.GetButtonDown (“Jump”) && estaNoChao) {
    transform.Translate (Vector2.up * forcaPulo * Time.deltaTime);

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!