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.
Poxa, se vocês continuassem ficaria tão feliz, vocês explicam tão bem!
Pode ficar tranquilo que existe continuação. Por sinal que é o de animação ;]
Jogos Indie Sim, eu vi, vocês fazem um ótimo trabalho.
E, tenho uma pergunta, vocês podem responder?
Doge Leal caso eu saiba responde-la, então sim
a parte de programação que desanima
tem como vc fazer um curso sobre logica de programação no unity?
Parabéns, muito melhor que ver vídeos
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?
Obrigado!
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.
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…
Caio Silvério Entendi. Nesse mês agora de outubro eu lanço um tutorial extra sobre programação com Unity usando C#.
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?
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.
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!
Jogos Indie obrigado pela explicação. Esclarecido agora.
Excelente tutorial !
fiz passo a passo e meu personagem não pula, oque eu faço ?
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.
tem um poblema qaqui quando chego na parte de bota a velocidade não aparesseu aqui
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.
Muito bom cara sabe explicar simples e descomplicado
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 😉
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!
Que estranho O.o
Pode ser um problema na sua instalação. Desinstala e instala novamente.
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 😀
O objeto chão foi criado na aula passada:
http://jogosindie.com/tutorial-de-unity-2d-2-adicionando-o-personagem/
Quando adicionamos o personagem ao cenário ^^
E se seu personagem está aparecendo atrás da tela, acho que você deve ter colocado a Main Camera dentro do jogo Player na aba Hierarchy, não? Se for, basta remover, mais na frente mostramos um script para a camera seguir o personagem ^^
Opa ah sim então é a câmera vou tirar ela rs, já o caso do chão vou dar uma olhada na aula anterior , obrigado pela resposta 😀 ( nossa nem vi que escrevi ” leyer ” kk )
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 ^^
Não consigo fazer o circle collider ter a mesma velocidade que o sprite. O que pode ser isso?
Como assim a mesma velocidade? .-.
Ele sempre herda a mesma posição do objeto O.o
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
Ó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.
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 ?
manda para [email protected] (Email está dando alguns problemas) ou [email protected]
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.
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.
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]
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.
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
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!
Na Aba Console, ele normalmente informa a linha do erro. Verifica qual é, pode estar faltando alguma coisa, como animator, aspas, chaves, ponto e virgula.
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.
outra coisa -> Assets/scripts/Player.cs(21,19): error CS1547: keyword ‘ void ‘ cannot be used in ths context
Refiz alguns passos, e agora saiu a mensagem, mas não consegui ver o que fiz errado.
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!
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.
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?
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á.
mt bom, obrigado.
ó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?
não consigo usar o
rigidbody2D.AddForce(transform.up * forcaPulo);
o unity diz e ele é obsoleto
oque eu poderia usar no lugar dele?
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
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.
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
No Unity 5:
GetComponent().AddForce(transform.up * forcapulo);
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);
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 🙂
vlw amigo =D
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
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
Tive esse problema por que estou usando a versão 5 do Unity, precisei fazer dessa forma:
GetComponent().AddForce(transform.up * forcaPulo);
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.
Ó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?
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 ^^
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!
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
Valeu pelo apoio ao pessoal Allexandre ^^
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!
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!
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!
Não é mais necessário, já consegui arrumar 😀
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?
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?
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.
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 😉
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.
Caramba cara, valeu mesmo!!!
Galera na hora de fazer o pulo da erro por causa do Addforce como resolve?
Tenta isso aqui Breno:
GetComponent<Rigidbody2D>().AddForce(transform.up * forcaPulo);
ao invés de chamar direto AddForce, chama o Rigidbody2D através do GetComponent
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 ?
Esse tutorial foi feito ano passado, versão era a 4.6. Algumas coisas mudaram dessa versão para a atual 5.1. Qual linha exatamente está apresentando erro?
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’
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 😉
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^^
Acho que você engoliu alguma parte do script O.o
dá uma checada ai
É pulei o script mesmo mas agora deu certo e valeu^^
e obrigado pelos tutoriais^^
o///
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.
Ue, alterando a Scale (X) do objeto que está com o Sprite Renderer, não vai?
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.
Valeu cara, tava precisando disso!
Eu que agradeço ^^
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.
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
^^
Essa dica ai do chaoVerificador muito proximo do personagem; é muito útil. Eu fiquei semanas quebrando a cabeça por causa disso. . . VLW mesmo.
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
Valeu pela dica da arrumação ! o checkbox não fica marcado quando roda o jogo
Então é isso mesmo.
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”
http://jogosindie.com/wp-content/uploads/2014/06/09-layer-Tutorial-Unity-2D-Jogos-Indie.jpg
Ali onde está a setinha do Layer, tem que estar “Piso”
Ainda nada 🙁
http://imgur.com/76xpX8q
o checkbox continua não sendo marcado quando roda o jogo
Curioso, não estou vendo nada no código ou nas imagens. Se preferir, pode mandar para o meu email a pasta compactada ([email protected]).
Ai eu caço o problema aqui com mais detalhes.
Mandei lá ,Carlos. Obrigado pela atenção e pelas respostas rápidas 🙂
Foi mal a demora, cai no sono. Mandei lá para o teu email como arrumar a bronca com imagens ;D
Incrível, pena que acabou T-T
muito bom o tutorial bem explicado!
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?
troca para SetIntenger (o S maiúsculo)
http://docs.unity3d.com/ScriptReference/Animator.SetInteger.html
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:() as Animator;
animator = GetComponent
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! =)
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# ^^
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 ^^
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.
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
aeee o/
Carlos W. Gama
não estou conseguindo colocar o meu “player script” no meu Player ….unity vs.5
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.
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);
Obrigado!
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 😉
Estou com um projeto de RPG 2D como faço para o personagem mover na vertical e horizontal?
Se é um RPG 2D, vai ser bem mais fácil você fazer com o RPG Maker.
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.
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.
verifica tanto os Colliders do personagem quanto do chão. Um dos dois está pequeno ^^
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
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
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
tb já perdi muita coisa feita. Por isso é bom sempre ir salvando, mesmo antes de completar tudo na scene 😉
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);
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 .
Você trocou os métodos ^^
NameToLayer = Transforma a Layer em um número inteiro
LayerToName = Transforma um número inteiro no nome da Layer correspondente
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.
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”
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.
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.
Se possível mostra como está seu código e um print do objeto no editor do Unity.
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
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
file:///C:/Users/VANIA%20NOVATY/Desktop/unity%20piso.PNG
Você mandou o link da imagem no seu computador, apenas você tem acesso a imagem por esse link.
Se não conseguir hospedar em algum canto, pode enviar a imagem para o meu e-mail: [email protected]
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).
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 😉
Meu camarada muito obrigado..mandei o código.
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 ^^
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
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!!!
Amigo, preciso de uma ajuda!
como faço para um objeto ter a mesma posição x de outro objeto?
Obrigado!
É bem simples Dandan
Basta por:
transform.position = outroGameObject.transform.position;
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.
Qual a versão do seu Unity ednea?
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 ^^
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
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.
Show de bola..entendi ..muito obrigado pela explicação 🙂
Nao funciona assim aqui
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));
}
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
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
void Movimentacao() {
if (Input.GetAxisRaw(“Horizontal”) > 0 ) {
transform.Translate (Vector2.right * velocidade * Time.deltaTime);
}
}
Esse trecho, está ok. Não vi nada de errado. Então possivelmente é nas linhas acima.
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?
Você colocou o else? O.o
Se você colocar o else, ele não vai executar os ifs de baixo.
mas quando coloco da erro
tem como enviar uma foto para eu te mostrar o erro :
Pode usar sites como o Upload Image
E quanto ao código, ele deve ser assim:
http://pastebin.com/JY8yYF3w
consegui faltava {
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();
envia uma foto para eu ver como e ?
Aqui
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??
Você colocou os elses que falei nos últimos comentários?
ta expirada
a foto
AQUI DE NOVO
cara na moral vc pode me ajudar pq meu personagem não pula?
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?
Cara meu unity é o 5.5.0f3 e não da, meu personagem não pula….
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);
}
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 🙁
Tenta isso (Input.GetButtonDown (“Jump”)) {
getcomponent.rigidbody2D.AddForce(transform.up * forcaPulo);
estou com o mesmo problema
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);
ola pessoal eu sou novo em progamação sei o basico de C que estou aprendendo na faculdade mas quero fazer um joguinho mas meu personagem não anda de geito nenhum usei até o codigo do post e não deu eu uso o 4.3.4 o que eu faço algum poderia me ajudar?
using UnityEngine;
using System.Collections;
public class playerScript : MonoBehaviour {
public float speed = 3f;
public float jumpForce = 200f;
private bool facingRight = true;
private float movX;
private Rigidbody2D rb;
private Transform transform;
// Use this for initialization
void Start () {
rb = GetComponent();
transform= GetComponent();
}
void fixedUpdate()
{
move();
}
void move()
{
movX = Input.GetAxis(“Horizontal”);
if (movX >0 &&! facingRight)
{
flip();
}
else if (movX <0 && facingRight)
flip();
rb.velocity= new Vector2(movX* speed, rb.velocity.y);
}
void flip()
{
facingRight= ! facingRight;
Vector3 scale = transform.localScale;
scale.x *= -1;
transform.localScale = scale;
}
}
algum dos scripts que venho tentando, eu amo programaçao mas só queria que ele andasse nem e tao dificil assim ksksk
O meu não ta reconhecendo a variável chaoVerificador. O personagem pulava normalmente quando o script estava sem o teste da linha: “estaNoChao = Physics2D.Linecast(transform.position, chaoVerificador.position, 1 << LayerMask.NameToLayer("Piso"));". Após colocá-lo aparece que a variável chaoVerificador não foi atribuida(sendo que ela foi)