Menu

Tutorial de Unity 2D #6 – Cenário parte 2

Olá meus caros Indies, hoje vamos ver a segunda e ultima parte de construção do cenário.

Eu estive pensando nesse mês no que por no cenário, terminei me empolgando e pensando muitas coisas, porém achei o ultimo post (Cenário Parte 1) um pouco puxado e muita gente tem dificuldade com a programação. Foi então percebi que o tutorial tem que ser simples, pois a ideia é ser didático e não a construção de um jogo real. Neste caso vou me manter aos três conteúdos que ficou faltando no post anterior: Plataforma que se move, plataforma que cai e um pulador. Caso posteriormente alguém esteja criando o seu jogo e queira ajuda de como fazer um determinado recurso do seu cenário, basta avisar nos comentários (Que as vezes demoro a ver >.<), página no facebook ou através do formulário de contatos. Precisam ter medo de perguntar não, sou tão de boa quanto qualquer um de vocês.

Ao pessoal que comenta e eu demoro a responder, eu peço mil desculpas. É que às vezes quando estou passando pelos comentários eu termino não vendo os de post’s mais antigos. Mas mesmo assim agradeço a todos vocês pelo apoio que dão, isso me anima a continuar fazendo os post’s do Jogos Indie, que acreditem, rouba toda o meu tempo livre, tornando um pouco cansativo ficar o tempo todo trabalhando.

Outra coisa que o pessoal pergunta bastante é quando sai as novas partes do tutorial. Normalmente eles saem na primeira sexta-feira do mês. Porém para quem acompanha o Jogos Indie já faz um tempo, sabe que eu tive um período bem apertado com o emprego, mestrado, artigos, seminários… Mas eu consegui uma bolsa no mestrado e por isso vou me ausentar mais do trabalho, tendo mais tempo livre para vocês também. Com isso tentarei trazer os tutoriais semana sim, semana não, beleza?

Neste mês teremos mais um novo post extra, sugerido por Caio Silvério nos comentários. O post consiste em fazer um pequeno tutorial só voltado a programação para Unity. Logo Irei rever alguns conceitos sobre classes, herança, variáveis (public e private), tipo de variáveis (float, bool, integer, Vector2…), condicionais, algumas classes e métodos já pronto do Unity, entre outras coisas.

Mas agora vamos ao que realmente interessa!

No ultimo tutorial fizemos três plataformas fixas, sendo as duas primeiras separadas por uma bola de fogo (Que quando adicionarmos o sistema de Vida e HP, a bola de fogo vai nos causar dano), e uma terceira bem longe de todas. A ideia desse tutorial é criar na segunda plataforma fixa, um pulador que nos lance para cima, aonde terá uma plataforma em movimentação, que servirá para alcançar outra plataforma que cai quando o personagem pisa. Ao finalizar esse trajeto chegaremos a ultima plataforma fixa, que terá uma bandeira para finalizar a fase. Ou seja, hoje os scripts serão mais lights.

A primeira coisa que faremos é o pulador, usando um clássico cogumelo. Para isso baixe o Sprite abaixo do BadCopNoDonut:

sprites_mushroom

Importe e escolha um dos sprites (Escolhi o cogumelo acima do @) para ser o pulador. Se lembre de mudar o Sprite Mode de Single para Multiple, para conseguir dá um slice nele.

01 - Mushroom

Uma vez cortado, arraste o Sprite gerado na aba Project (sprites_mushroom_0) para o final da segunda plataforma fixa na aba Scene.

02 - Posicionando

Pronto agora vamos criar um novo objeto através do menu no topo GameObject >> Create Empty. O posicione na mesma posição do sprite_mushroom (Pode copiar a position de sprites_mushroom e colar na position do novo objeto através da aba Inspector). Estando na mesma posição, troque o nome de GameObject para Cogumelo através da aba Inspector (Tente evitar essa minha mania de escrever coisas em português e coisa em inglês. Se o seu código estiver em português faça todo em português, se tiver em inglês, faça todo em inglês. Estou usando o nome Cogumelo aqui para ficar mais didático para quem não sabe muito de inglês.) Após isto, arraste o sprite do cogumelo para dentro do objeto. Sua tela deverá ficar parecida com isso:

03 - Criando objeto cogumelo

No objeto Cogumelo adicione um Circle Collider 2D (Add Component >> Physics 2D >> Circle Collider 2D), já que o topo do nosso cogumelo é curvado e nosso personagem pode subir sem dificuldade. Lembre-se de diminuir o raio do circulo e abaixa-lo um pouco.

04 - CircleCollider

Pronto com isso nosso objeto esta pronto. Só falta fazer o script para fazer nosso personagem pular ao encostar-se a ele. Para isso clique com o botão direito na pasta scripts na aba Project e escolha Create >> C# Script. Vamos dá o nome do nosso código de Cogumelo. Após isso der enter no script ou dois cliques para abrir o MonoDevelop.

A primeira coisa é fazer praticamente o mesmo que fizemos no nosso script de player. Adicionar uma variável publica chamada forcaPulo.

	public float forcaPulo = 500f;

Isso indicará o quão alto será o pulo do objeto que colidir. Deixando como público para podermos alterar o valor direto pelo Unity e ficando com valor padrão 500. Outra coisa que precisamos adicionar é o método OnCollisionEnter2D. que será bem simples.

	void OnCollisionEnter2D (Collision2D colisor) {
		colisor.gameObject.rigidbody2D.AddForce(transform.up * forcaPulo);
	}

Para quem usa Unity 5, fica dessa forma ai:

	void OnCollisionEnter2D (Collision2D colisor) {
		colisor.gameObject.GetComponent.AddForce(transform.up * forcaPulo);
	}

Vocês já viram esse código antes no player, mas irei explicar novamente: Quando algum objeto (colisor) encostar no cogumelo, seja ele o player ou não será arremessado para cima. gameObject nós dará a permissão de usar os atributos do objeto e rigidbody2D permitirá que a gente aplique uma força no personagem através do AddForce. Essa força que estamos aplicando será para cima (transform.up) e tão alto quanto definirmos em forcaPulo.

Agora é só salvar e no Unity atrelar o script Cogumelo ao objeto Cogumelo.

05 - Adicionando o script

Agora é só aperta o Play e verificar se está tudo certo.

Legal, né? Agora faremos a plataforma em movimentação. A primeira coisa que eu vou pedir para vocês é importar para a pasta de sprites a seguinte imagem:

sprites_plataformas

Poderão escolher qualquer retângulo desse para ser a plataforma que vocês usarão. Nós vamos precisar de duas delas. Uma que irá se mover e outra que cai. Eu usarei a retangular grossa para a plataforma em movimento e uma retangular fina com cara de fraca para a que cairá.

06 - Plataformas

Dividido os sprites é hora de posiciona-los em nosso cenário. Arraste o seu sprite escolhido para ser a plataforma em movimento para o cenário e crie um Empty Object  (Menu >> Game Object >> Create Empty). Renomei o nome desse objeto para PlataformaMovimento e jogue o seu sprite da plataforma dentro do objeto. Para que ele fique centralizado no objeto será preciso zerar as posição de x, y, z do sprite. Por fim posicione sua PlataformaMovimento para o local para um pouco após o cogumelo.

07 - Posicionando a plataforma

Próximo passo é adicionar no objeto PlataformaMovimento um Box Collider. Ajuste o tamanho do box para cobrir apenas o seu retângulo e posteriormente mude o Layer do objeto para “Piso”. Se lembra do porquê do Layer?  Sem ele seu personagem não irá conseguir pular em cima da plataforma. Pronto, com isso seu personagem já deve conseguir subir na plataforma.

08 - Layer e  BoxCollider

Agora vamos criar um script para movimenta-lo. Para isso na pasta de scripts na aba Project clique com o botão direito e Create >> C# Script. Aqui podemos criar um script só para a plataforma ou um genérico que pode ser usado em vários outros objetos. Achei melhor para esta situação criar um genérico, já que fora movimentar, ele não terá nenhuma outra característica especifica. Neste caso chame o script de Movimentacao ou de algo que te faça lembra movimento.

Abra o seu script e vamos pensar. A gente já viu anteriormente como funciona o movimento correto? Então para esse script vamos precisar as seguintes variáveis:

velocidade – Que irá indicar o quão rápido o objeto se movimentará.

duracaoPosicao – É o tempo que ele irá durar na mesma posição, antes de inverter de lado (Esquerda e direita), ou seja, quanto maior a duração, mais distante o caminho será percorrido.

tempo – O tempo que ele ainda está na mesma posição. Ex: Se a duração da posição for 5 segundos, ele irá mudar de posição quando a variável tempo for maior ou igual a 5. Ao mudar de posição, esse tempo reinicia.

posicao –  Essa variável guardaria a direção atual que o objeto está andando, ou seja, você poderia escolher várias formas de fazer isso. True ou false, -1 ou 1, 1 ou 0, “esquerda” ou “direita”. Eu optei fazer true (direita) e false (esquerda).

Observando essas variáveis vocês já conseguem dizer quais serão public (Poder ser controlada direto pelo Unity para cada Objeto independente) ou private (Não pode ser controlado pelo Unity e todos os dados serão iguais para todos os objetos).

velocidade – public, pois é mais fácil de adequar seu valor lá no Unity nos testes e objetos diferentes podem ter velocidades diferentes.

duracaoPosicao – public, mais fácil de controlar pelo unity e objetos diferentes podem percorrer distâncias diferentes

tempo –  private, pois essa variáveis apenas importa para o comportamento do script, determinando o momento de virar.

posicao – public, pois podemos querer que objetos diferentes iniciem em direções opostas. Nem sempre vai começar para a esquerda como também nem sempre para a direita, estando como public você escolherá a posição inicial.

Pronto, entendemos as variáveis e seu comportamento, vamos adiciona-las ao script:

	public float velocidade;
	public float duracaoPosicao;
	public float tempo;
	public bool posicao;

Como nosso script terá apenas a movimentação e mais nada, podemos fazer tudo dentro do método Update, já que não terá problema em misturar, movimentação com habilidades ou outras características do mesmo objeto. Neste caso no nosso script vamos fazer a seguinte adição:

	void Update () {
		//Aumenta o tempo que esta na posiçao atual
		tempo += Time.deltaTime;
		
		//Se o tempo 
		if (tempo >= duracaoPosicao) {
			//Zera contagem
			tempo = 0;
			
			//Muda a posiçao
			if (posicao) {
				posicao = false;
			} else {
				posicao = true;
			}
		}
		//movimenta
		if (posicao) {
			transform.Translate (Vector2.right * velocidade * Time.deltaTime);
		} else {
			transform.Translate (-Vector2.right * velocidade * Time.deltaTime);
		}	
	}

Nesse script estamos fazendo:

tempo += Time.deltaTime; (Aumentando o tempo corrido na mesma posição)

if (tempo >= duracaoPosicao) { (Verificamos se o tempo corrido nessa posição já atingiu o tempo limite para ela)

tempo = 0; (Caso já tenha atingindo, iremos zerar a contagem, pois ela mudará de lado)

if (posicao) {

                posicao = false;

} else {

                posicao = true;

}

Se a posição atual for direita (true), dizemos que agora ela será esquerda (false) e caso ela seja esquerda (false), dizemos que a posição agora será direita (true).

if (posicao) {

transform.Translate (Vector2.right * velocidade * Time.deltaTime);

} else {

                transform.Translate (-Vector2.right * velocidade * Time.deltaTime);

}

Por ultimo movimentamos o objeto sempre para a (direita) na velocidade determinada quando a posição for true e para a esquerda quando for false.

Pronto, agora é hora de salvar e vincular o script Movimento ao Objeto PlataformaMovimento. Deixe a velocidade sendo 2, a duração sendo 1 e a posição como verdadeira e verifique se esta tudo certo.

09 - Script Movimento

Caso já tenha conseguido colocar o seu personagem em cima da plataforma, vai observar que ele não se move junto a plataforma. Se pararmos para pensar, o motivo é claro, nós apenas estamos movimentando a plataforma. Se você gostou desse jeito, não precisa fazer alterações, mas se quer que o personagem se mova junto, vamos precisar mexer com outras duas classes reservadas do Unity que apresentei aqui em posts anteriores.

OnCollisionStay2D = Enquanto o personagem estiver em cima da plataforma, ele deverá se mover na mesma direção que ela.

OnCollisionExit2D = Assim que o personagem sair da plataforma, ele deixará de se mover na mesma direção dela.

Então bora aos scripts:

	void OnCollisionStay2D(Collision2D colisor) {
		if (colisor.gameObject.name == "Player") {
			colisor.gameObject.transform.parent = transform;
		}
	}

Aqui estou informando que se o objeto que encostou-se à plataforma possuir o nome “Player”, então, o seu transform irá herdar as mesmas ações do transform do objeto. Isto será a mesma coisa que nos pegássemos o Player na aba Hierachy e jogar dentro do objeto com o script, porém apenas o transform é que irá herdar as características. Ou seja se a plataforma andar 5 passos, o personagem também irá.  Conseguiram entender?

O segundo script que precisamos adicionar é:

	void OnCollisionExit2D(Collision2D colisor) {
		if (colisor.gameObject.name == "Player") {
			colisor.gameObject.transform.parent = null;
		}
	}

Aqui vamos exatamente o contrário. Estamos dizendo que se o objeto que deixar de colidir com a plataforma possui o nome “Player” (if (colisor.gameObject.name == “Player”)), então seu transform deixará de herdar as características do objeto atual (colisor.gameObject.transform.parent = null).

Salve e manda ver. Tudo certo? Então vamos para o nosso ultimo desafio. Criar uma plataforma que caia quando o player pisa em cima.

Lembram-se que pegamos dois sprites de plataforma? É hora de usarmos o segundo. Posicione-o após a plataforma em movimento e crie um objeto chamado PlataformaCai e jogue o seu sprite lá assim como fizemos na PlataformaMovimento (Não se esqueçam de zerar as posição do sprite). Feito isto adicionem também o Box Collider e o Layer Piso.

10 - Posicionando PlataformaCai

Desta forma já é possível seu personagem cruzar o cenário. Seu ultimo trabalho desse tutorial (mentira) agora será criar o script para a plataforma cair. Esse script ao contrário do movimento eu não vejo aonde mais pode ser utilizado a não ser em plataformas que caem, neste caso o nome do script será PlataformaCai. Se vocês souberem de outra aplicação podem usar um nome genérico para seu script. A ideia aqui é que nem jogos do Mario e do Sonic, onde você pisa numa plataforma, ela irá cair após alguns segundos.

Então vamos lá, crie um script na pasta scripts com o nome PlataformaCai. Nesse script vamos precisar de três variáveis:

duracaoCair – Indica o tempo que irá demorar para a plataforma cair após o personagem pisar. (Public)

tempo – mesma funcionalidade do outro tempo, serve para armazenar o tempo desde a ultima vez que o player pisou. (Private)

pisou – Indica se o personagem pisou ou não. Se o personagem pisou, inicia a contagem para a plataforma cair. (Private)

Adicionando as variáveis:

	public float duracaoCair;
	private float tempo;
	private bool pisou;

Como a contagem irá iniciar apenas quando nosso player pisar na plataforma, então iremos precisar criar um OnCollisionEnter2D:

	void OnCollisionEnter2D(Collision2D colisor) {
		if (colisor.gameObject.name == "Player") {
			pisou = true;
		}
	}

Aqui informamos que quando o objeto “Player” tocar na plataforma, irá ativar a variável pisou. Agora precisamos mudar o seu Update, para realizar a contagem quando “pisou” for verdadeiro:

	void Update () {
		if (pisou) {
			tempo+= Time.deltaTime;

			if (tempo >= duracaoCair) {
				gameObject.AddComponent("Rigidbody2D");
				Destroy (gameObject,2f);
			}
		}
	}

Para quem usa Unity 5, fica dessa forma ai:

gameObject.AddComponent();

Bem fácil esse script de entender, não acham? Primeiro estamos verificando se pisou é verdadeiro ou não. Ele apenas será verdadeiro caso o personagem tenha pisado, como fizemos em OnCollisionEnter2D.

Se pisou for verdadeiro, será iniciando a contagem do tempo e quando o tempo for maior ou igual ao tempo que dissermos que seria necessário para cair, iremos adicionar ao objeto atual que está com o script o componente Rigidbody2D, que irá aplicar a gravidade e fazer o objeto cair. Ainda podemos também destruir esse objeto após uns segundos, já que ele não terá mais importância para a gente.

Pronto, agora vincule esse script ao objeto PlataformaCai e diga o tempo que você quer que ele dure antes de cair, no meu caso eu informei 1 segundo.

11 - Plataforma Cair

Agora é só testar e ver se esta tudo ok.

Com isso nosso tutorial deveria acabar por aqui, porém se você morrer, a plataforma não voltará a aparecer, já que estamos apenas jogando o personagem para a posição de origem. Neste caso, vou adiantar algo de aulas futuras. Agora quando você morrer, vamos dá um restart na fase atual, desta forma tudo voltará a ser como era antes.

Então vamos ao nosso script da Lava (Lava.cs) e vamos trocar o nosso OnTriggerEnter2D para:

	void OnTriggerEnter2D(Collider2D colisor) {
		if (colisor.gameObject.tag == "Player") {
			Application.LoadLevel(Application.loadedLevel);
		}
	}

Vou dá uma prévia do que seja isso, mas explicarei melhor o Application.LoadLevel mais na frente. Esse método serve para carregar as diferentes cenas do seu jogo. Digamos que o seu jogo tenha: Tela inicial, fase 1, fase 2, fase 3, Tela de Game Over e Créditos. Tudo isso são cenas (scenes) e você irá mudar de uma para outra usando o Application.LoadLevel(). Outra utilidade disso é para caso possua um jogo com diferentes cenários, exemplo os quartos de uma casa. Toda vez que você entrar em um quarto diferente que seja uma scene, irá usar dessa forma também. Já o atributo Application.loadedLevel ele pega a scene atual, ou seja, a que estamos. Ao juntar as duas será carregado de novo a scene atual. Igual a dá um restart na fase, entenderam?

Mais uma coisa, com todos os seus objetos criados (Pulador, PlataformaMovimento e PlataformaCai), você pode criar um prefab de cada um deles para  utiliza-los com facilidade em outras cenas (scenes) ou repeti-los na mesma cena (scene). Então bora lá fazer isso. Na pasta prefabs crie três Prefab: Cogumelo, PlataformaMovimento, PlataformaCai. Posteriormente arraste os objetos da aba Hierarchy para seu Prefab correspondendo na aba Project.

Por fim, fica um desafio básico para vocês, algo que já fizemos antes. Baixem o sprite abaixo:

sprite_flag

Vocês devem criar a bandeira no final da fase, na ultima plataforma. (Podem ver no meu jogo como ficou na página de Índice).

Os passos são:

1 – Importar o Sprite

2 – Dividir o sprite em partes iguais (multiple)

3 – Criar um objeto chamado Bandeira

4 – Jogar um sprite dentro do objeto Bandeira

5 – Criar a animação da bandeira se movendo (Aba Animation) e salvar na pasta: “animations/bandeira”.

6 – Posicionar a bandeira no final da fase e ser feliz.

Vamos ver se já estão conseguindo dar os seus passos sozinhos.

Espero que tenham gostado dessa aula e até o próximo tutorial, que acredito que seja no dia 17/10, um tutorial só de C# para Unity. Qualquer dúvida já sabem, baixa deixar nos comentários.

Lava.cs

using UnityEngine;
using System.Collections;

public class Lava : MonoBehaviour {
	private Transform player;

	// Use this for initialization
	void Start () {
		player = GameObject.FindGameObjectWithTag ("Player").transform;
	}
	
	// Update is called once per frame
	void Update () {
	
	}

	void OnTriggerEnter2D(Collider2D colisor) {
		if (colisor.gameObject.tag == "Player") {
			Application.LoadLevel(Application.loadedLevel);
		}
	}
}

Cogumelo.cs

using UnityEngine;
using System.Collections;

public class Cogumelo : MonoBehaviour {

	public float forcaPulo = 500f;

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

	}

	void OnCollisionEnter2D (Collision2D colisor) {
		colisor.gameObject.rigidbody2D.AddForce(transform.up * forcaPulo);
	}
}

 

Movimentacao.cs

using UnityEngine;
using System.Collections;

public class Movimentacao : MonoBehaviour {
	
	public float velocidade;
	public float duracaoPosicao;
	private float tempo;
	public bool posicao;
	
	// Use this for initialization
	void Start () {
	}
	
	// Update is called once per frame
	void Update () {
		//Aumenta o tempo que esta na posicaçao atual
		tempo += Time.deltaTime;
		
		//Se o tempo 
		if (tempo >= duracaoPosicao) {
			//Zera contagem
			tempo = 0;
			
			//Muda a posiçao
			if (posicao) {
				posicao = false;
			} else {
				posicao = true;
			}
		}
		//movimenta
		if (posicao) {
			transform.Translate (Vector2.right * velocidade * Time.deltaTime);
		} else {
			transform.Translate (-Vector2.right * velocidade * Time.deltaTime);
		}

		
	}

	void OnCollisionStay2D(Collision2D colisor) {
		if (colisor.gameObject.name == "Player") {
			colisor.gameObject.transform.parent = transform;
		}
	}

	void OnCollisionExit2D(Collision2D colisor) {
		if (colisor.gameObject.name == "Player") {
			colisor.gameObject.transform.parent = null;
		}
	}
}

PlataformaCai.cs

using UnityEngine;
using System.Collections;

public class PlataformaCai : MonoBehaviour {

	public float duracaoCair;
	private float tempo;
	private bool pisou;

	// Use this for initialization
	void Start () {
	
	}
	
	// Update is called once per frame
	void Update () {
		if (pisou) {
			tempo+= Time.deltaTime;

			if (tempo >= duracaoCair) {
				gameObject.AddComponent("Rigidbody2D");
				Destroy (gameObject,2f);
			}
		}
	}

	void OnCollisionEnter2D(Collision2D colisor) {
		if (colisor.gameObject.name == "Player") {
			pisou = true;
		}
	}
}

Parte 5 – Cenário parte 1

Indice Unity 2D

Parte 7 – Vida

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

105 comments

  1. Marcos Cruz disse:

    wow, exelente aula cara assim como as anteriores, e o melhor ainda é que, postou prazo que havia falado, espero que continue com o ótimo trabalho e mais pessoas reconheça seu trabalho assim como eu.

  2. Já quebrei a cabeça com muito tutorial e video por ai, mas os seus vc passa um conteudo bacana e simples de entender! Valeu pelos tutoriais e eu fico aguardando por cada aula hauaha

  3. Não vai ter mais? adorei as aulas

  4. Megany disse:

    Vai chover FlapBirds com esse excelente tutorial.

  5. claudinei2507 disse:

    Boa tarde Amigo,
    Primeiramente parabéns belos tutoriais, excelente iniciativa , estou aprendendo muito.

    Gostaria de tirar uma duvida ja refiz , revisei umas 5 vezes o projeto e sempre que ativo a caixa de seleçao is trigger o personagem passa direto pela lava e nao acontece nada . sabes o motivo

  6. claudinei2507 disse:

    Da esso erro aqui no script, tambem

    Script error: OnTriggerEnter2D
    This message parameter has to be of type: Collider2D
    The message will be ignored.

    • Opa Claudine!

      Então a mensagem de erro esta dizendo ai o seguinte. Que o método OnTriggerEnter2D deve receber como parametro um Collider2D.

      Você provavelmente usou um Collision2D ao invés do Collider2D.

      Para OnCollisionEnter2D usa Collision2D:
      void OnCollisionEnter2D(Collision2D colisor)

      Para OnTriggerEnter2D usa Collider2D:
      void OnTriggerEnter2D(Collider 2D)

      Eu trocava direto também isso antes, mas é só pensar no Collision (OnCollisionEnter2D) se usa Collision (2D), no que não é Collision (OnTriggerEnter2D) não se usa Collision (Collider2D)

  7. Kulyk disse:

    cara copiei igual teu código mas a plataforma não faz o personagem se mover junto, comofas?

  8. Gari disse:

    Olha, sou dono de um jogo online que eu não desenvolvi ele (legendro.com.br). Por isso estou aprendendo a criar jogos. Não tem como aprender. Ele posta as fotos, código e ainda da dicas. Eu programo fluente em várias linguagens achei que programar jogos seria um pé no saco, mas com essas aulas tudo se tornou super fácil códigos comentados já aprendi a “lógica” do básico para se criar jogos, agora estou aprendendo a parte mais difícil que é a vida e os inimigos que vc postou mais lá na frente. Porque não bota um botãozinho de doação via pagseguro? As vezes os usuários ficam tão animados com a qualidade que se sentem com vontade de com prazer fazer doações para esse site tão importante.

  9. carloswgama disse:

    Então Gari, dinheiro não é exatamente um problema.

    É verdade que se o site ganhasse uma grana boa, eu não precisaria me afastar dos posts e tutoriais. Mas duvido muito que as doações fosse gerar alguma estabilidade financeira. logo eu precisaria me afastar de qualquer forma :/

  10. Kulyk disse:

    me ajuda Carloswgama!! por favor!!

    cara meu codigo tá assim da plataforma:

    void OnCollisionStay2D(Collision2D colisor) {

    if (colisor.gameObject.name == “Player”)
    {

    colisor.gameObject.transform.parent = transform;

    }
    }

    void OnCollisionExit2D(Collision2D colisor) {

    if (colisor.gameObject.name == “Player”)
    {

    colisor.gameObject.transform.parent = null;
    }
    }

    e não mexe o personagem junto com a plataforma
    já tentei fazerde tudo
    procurei em varios foruns
    nao sei fazer cara
    por favooooooooor

  11. Kulyk disse:

    ja resolvi, o box collider tava no sprite da plataforma, e nao no objeto inteiro! valeu! ótimos tutoriais Carlos, tu ensina muito bem mesmo, faz um ótimo trabalho! espero ansiosamente pelo intermediário!

    obrigado!

  12. carloswgama disse:

    Infelizmente eu não ando mais ajudando o pessoal em código não Kulyk, só em coisas teóricas simples :/

    Pois se eu ajudar um, tenho que ajudar a todos e nessa brincadeira eu estava perdendo já várias horas do dia só ajudando o pessoal. Foi um dos motivos para eu me afastar do site por algum tempo, até eu terminar meus estudos e arrumar um emprego.

  13. carloswgama Muito boa tarde, primeiro queria agradecer pelo tutorial e as dicas esta me ajudando muito, e me deu novas ideia para me projeto, eu nao sou muito experiente com unity e desconheço muitas funcionalidade mais vo correndo atras da informação sempre q possivel, entao eu gostaria de pergunta um coisa digamos que passamos sobre aquela que deixamos suspensa e enfim vamo continuar com o andamento do jogo, mais em um momento morremos no game e voltamos para a onde estavamos antes de pisar na plataforma, e como ela se destrui apos acionarmos os comando o personagem nao podera avanças pois nao tem a plataforma la novamente, bem existe um meio de, fazer com que ele reapareça em determinado tempo digado, eu pise levou 1 segundo pra cair, 3 para destruir, e 8~9 segundos para reaparecer, sendo que esse reaparecer so se ative se Destroy (gameObject,2f) for verdadeiro, eu tenho a analogia mais nao estou tendo conhecimento para empregala. sei q nao ajuda com codigos tem como não é?

  14. carloswgama disse:

    Opa Eduardo, beleza?

    Então no momento em que você destroy existe um comando chamado OnDestroy. Você pode instanciar (criar) uma nova plataforma no momento em que ela for destruída:
    Instantiate (prefabDaPlataforma, Vector3Posicao, Vector3Rotacao);

    Ou você cria um objeto só para fazer o respawn (Próximos tutoriais, mostra um script de respawn) da plataformar quando ela não existir.

  15. pessoal, para quem está na versão 5 do unity, seguem alguns métodos que funcionam de forma diferente:

    No método para fazer o pulo ao chegar no cogumelo, coloquem:
    void OnCollisionEnter2D (Collision2D colisor){
    colisor.gameObject.GetComponent().AddForce(transform.up * forcaPulo);
    }

    No método de cair a plataforma, a adição do rigidbody fica assim:
    gameObject.AddComponent();

  16. luan disse:

    opa! Carlos Wgama.. cara vc realmente é muito fera… parabéns cara!!!… acompanhando os tutoriais aqui 🙂 gostaria de saber se posso usar a imagem dessas madeirinhas no meu joguinho..??? a arte é muito boa..

  17. carloswgama disse:

    Opa Luan, eu tenho nenhum direito sobre as imagens. Essas são imagens que você encontra facilmente no Google Image do jogo Angry Birds.

    para jogos simples provavelmente não tem bronca, mas se você quiser comercializar, ai sim eu recomendo você procurar um pack de imagens grátis ou pedir para alguém montar o layout.

  18. luan disse:

    vlw cara.. obrigado pela resposta 🙂

  19. Renan Vilela disse:

    Ótimo tutorial. Eu tive um problema, pois usei seu código em um outro projeto, e a plataforma estava com a escala altera. Quando eu movia o personagem sobre ela o personagem ganhava a escala da plataforma. KKKK

  20. carloswgama disse:

    Oxe, que estranho O.o

    Maaas, até que dá para usar isso ai de forma criativa. Procura por algum OnCollider, que deve está aplicando alterando a escala.

  21. Fabiano Amorim disse:

    Cara, parabéns mesmo pelos tutoriais. Você dá ótimas aulas. Vou para a aula 7 agora e meu joguinho já está muito legal. Além das dicas que você passou nos tutoriais, adicionei um movimento de jato estilo Mega Man quando clica no pulo enquanto está no ar. Adicionei moedinhas que somem ao colidir com elas. também criei uma classe genérica de movimentação de objetos ida e volta que não apenas movimenta na horizontal, como movimenta para qualquer lado, incluindo diagonal.

    Estou amando essa engine. Agiliza muito a criação de um jogo.

    Um grande abraço

    • pow, muito massa ^^

      É legal saber que vocês fazem coisas diferentes do tutorial. Isso mostra que vocês vão conseguir resolver “problemas” que eu ou algum outro tutorial não ensine, coisa bastante comum ao desenvolver um jogo único.

  22. Natalie disse:

    Allexandre to usando o Unity 5 e o metodo de cair a plataforma ta dando erro na adição do rigidbody, ja tentei tudo mas nao roda.. será que você podia mostrar como ficou o seu metodo?

    • E aê Dona Natalie, tudo joia? ^^

      Então, se o Allexandre pode responder ou não, eu não sei, mas eu posso =P

      O que ele colocou ali está correto, só que quando você adiciona algo entre “<” e “>” simplesmente o conteúdo é automaticamente removido, por ser considerado uma tag html.

      Então o que ele quis dizer é que a forma atual é essa aqui oh:
      gameObject.AddComponent<Rigidbody2D>();

      Espero que isso resolva tua bronca, qualquer coisa é só falar o.o7

  23. Gabriel Ramos Carvalho disse:

    Quando o meu player toca na plataforma que se meche ele começa a girar

  24. Gabriel Ramos Carvalho disse:

    Tipo assim só que mais forte

    • Entendi o erro =P

      Bom, o ajuste é bem simples. Seu personagem não está com um Circle Collider 2D? Ou seja é como se ele fosse uma bola, por isso que ele gira assim (Mas está certo!)

      Para arrumar, você vai lá no personagem na aba Hierachy, e procura na aba Inspector pelo Rigidbody 2D. Lá embaixo (Acho que é a ultima opção), vai ter um campo chamado Constraint ou algo assim. Dentro dele você vai poder congelar o movimento do seu personagem, nesta parte você marca o Freezing Z (Rotation), com isso seu personagem não vai mais girar 😉

      Freezing X vai impedir que seu personagem ande para frente e pra trás e o Freezing Y que ele vá para cima e para baixo, então pode deixar essas duas desmarcadas mesmo.

  25. Você esqueceu de colocar () no GetComponent

    Vai ficar assim:

    colisor.gameObject.GetComponent().AddForce(transform.up * forcaPulo);

    =)

    • Edit: O ctrl + c e ctrl + v cortou uma parte do script.. ‘0’

      Vai ficar assim:

      colisor.gameObject.GetComponent().AddForce(transform.up * forcaPulo);

    • de novo.. cade o ridigbody2d que n vai.. wtffff

      GetComponent()

      PS: Vc deveria criar no site um modo Editor pra não ficar toda hora postando novos comentários e sim editar o que foi postado.

    • Deu uns bugs bizarros aqui. Quando meu personagem encosta na lateral do cogumelo, ele é isolado para ao alto numa força maior que o do próprio script. O que fazer?

    • O que significa os códigos: +=, -=, *=, /=, %=, >>=, <<=, &=, ^=, no C#?

      • E como faço a publicação do Rotate (Ex: public Rotate… ) usando Vector3 ?

      • Tiago, isso não é do C# e sim da maioria das linguagens de programação. Quando você ver um operador seguido do =, significa que estamos atribuindo a variável atual uma ação.

        Exemplo:
        valor += 2 é o mesmo que valor = valor + 2
        valor -= 2 é o mesmo que valor = valor – 2
        O mesmo vale para os demais.

        Todavia esses comandos que você usou ai, não tem relação alguma com o tutorial, pois eu não os usei aqui. Inclusive alguns desses como >>= e <<= eu nunca vi em toda a minha vida de programação. Nestes casos que não tem relação direta ao tutorial ou ao Unity o melhor é você buscar no google, para não desvincular tanto as coisas aqui. Neste ponto como você está muito interessado nos códigos, em fazer modificações e tudo mais, eu recomendo muito que você faça antes um curso básico de algoritmo e programação. E eu não sei até que ponto você realmente está buscando aprendizado e querendo aprender ou se está de certa forma tentando brincar comigo, pois em 2 dias já houveram mais de 25 comentários e em nenhum deles você escultou minhas sugestões. Então assim realmente fica muito difícil te ajudar, caso realmente você queira ser ajudado. Dá para ver claramente nos seus comentários que você não está entendendo o que está fazendo e quer avançar, o que faz gerar uma bola de neve de falta de informação. O tutorial foi feito com duração de meses, não é atoa. É uma postagem por semana, já para vocês entenderem bem o post atual, para só então seguir para o próximo, então vá com calma, não tente terminar tudo em um ou dois dias, se você ainda não entendeu conteúdos anteriores. Isso aqui é um tutorial e a ideia é você APRENDER e não eu fazer os conteúdos para você, saca? Errar faz parte do aprendizado junto com as tentativas de solução. Se eu mostrar sempre a solução sem você ter passado pelo processo de errar e tentar arrumar sozinho, você nunca vai desenvolver o conhecimento completo. Programação é isso, é tentativa e erro. Eu mesmo com tantos anos de experiência ainda vivo cometendo erros no código por falta de atenção e conhecimento, mas olho a mensagem de erro (Que no caso do Unity, aparece no Console), vou lá e tento entender o erro para corrigi-lo, você nunca vai conseguir desenvolver um jogo, um site um app sem cometer nenhum erro durante a programação e é justamente esses erros quando você corre atrás da solução sem tê-la de mão beijada é que você entende de verdade como as coisas funcionam. Isso que eu acabei de falar é uma técnica de aprendizado chamada Construcionismo, que em minha opinião é algo muito forte e que todo programador tem que levar consigo, para se desenvolver bem.

        • Eu comecei recentemente um curso de C# pelo youtube: canal do 2torial e as apostilas do K-19, que vai desde lógica de programação até orientação a objetos. xD
          Eu gostaria de saber o comando utilizado pelo unity pra fazer a plataforma subir, praa rotação enquanto o objeto se move e o bug do cogumelo (quando encosto na lateral dele, o mesmo sai voando pro alto – como arrumar?).

          • Efraim Efraim disse:

            Cara, acho que depois de tudo isso vc vai ficar devendo um pacotão de ruffles pro Carlos auauhauhauhauhauhauaha Maaaainzinha do céu

          • Para fazer a plataforma subir é igual a ela ir para o lado. Só que ao invés de você usar o Vector3.right, usaria o Vector3.up:

            transform.Translate (Vector2.right * velocidade * Time.deltaTime);

            para

            transform.Translate (Vector2.up * velocidade * Time.deltaTime);

            Já essa questão da rotação que você falou eu não entendi. Em relação ao cogumelo uma alternativa seria colocar um pequeno timer antes de aplicar a força, para evitar que seja aplicado uma força em outra já existente.

            • Em relação a Rotação do objeto, seria tipo assim: O objeto está se movimentando para a horizontal (esquerda, direita) normalmente como está no script. O que eu queria fazer é enquanto ele se movimentar, rotacionar pra esquerda, como se fosse uma bola giratória, para dificultar a passagem do player pelo objeto. Um exemplo disso: A madeira giratória na fase do macaquinho no super mario 64, lembra? Aquela madeira giratória que fica de frente pra cachoeira! =)

              • Nunca joguei Super Mario 64, não sou um dos maiores fãs do bigodudo. Se você puder mandar um vídeo desa madeira ajudaria a entender a ideia.

                Mas embora eu nunca tenha jogado Super Mario 64, já vi vários vídeos e sei que ele é 3D, então a funcionalidade que você está querendo não é de profundidade não, né? (3D)

                • Não é profundidade não =)..

                  Está aqui o video: só colocar aos 2:40; ou 8:50; ou 10:56 ou 13:22. =)

                    • Já que a o comando de subir e desce plataforma é do transform.Translate (Vector2.up * velocidade * Time.deltaTime); , como faço para o objeto subir até uma determinada posição determinada por mim e volta para sua posição inicial fazendo esse loop infinito?

                    • Vou continuar usando a mesma estratégia contigo até você criar o habito de pensar nos códigos. Ou seja, vou falar a lógica e você vai transforma-la em código. Depois vou fazer você começar a pensar na lógica, dando explicações mais abstratas, para que você pense em uma lógica mais concreta.

                      Aqui é bem mais simples a situação. Você apenas precisa saber qual é a posição inicial e final de Y (Você pode ver lá no Unity movendo objeto e vendo sua posição na aba Inspector).

                      Após saber essas posições, você pode dizer no código que se a posição do objeto em y for >= que a posição final de y, então inverte a direção. Se y for <= que a posição inicial, inverte a posição da direção. Você também pode usar a ideia de ter um contador de tempo, igualzinho ao que fizemos na movimentação horizontal. Em outras palavras o código é praticamente o mesmo que usamos na vertical, só ajustando para a posição vertical.

                  • Entendi, acho que em Sonic ou outro jogo tem algo semelhante.

                    Bom Tiago, toda vez você está perguntando como fazer sem antes parar para pensar, então a estrategia que eu vou tomar contigo é diferente. Eu vou dizer a lógica e você vai ter que pensar em como transformar a lógica em código. Do contrário se eu sempre disser para você como faz a lógica e código, você nunca vai evolui, pois não vai ter o habito de pensar em como criar as coisas, ficando sempre preso a outras pessoas para desenvolver.

                    A ideia aqui é você verificar se o personagem está encostado no tronco (Você pode usar o método OnColliderStay2D, dê uma pesquisada, não vou explicar, pois aqui mesmo no site eu falo sobre isso no post extra de programação). Quando o personagem estiver encostado no tronco o tronco vai ativar uma animação que dê a impressão que está girando (Pode usar até um efeito de Scrolling em um material com a textura ao invés de um Sprite Renderer)

                    Enquanto o personagem estiver no tronco, você vai usar uma contagem de tempo , podendo utilizar o Time.deltaTime para somar o tempo que o player está no tronco. Se esse tempo passar de um tempo X, então ignora a colisão para o personagem cair.

                    Se o player sair do tronco (Pode usar o método OnColliderExit2D), você zera a contagem atribuindo ao contador o valor 0.

                    Você está querendo fazer coisas complicada e isso é ótimo, porém você não quer pensar em como fazer, apenas está querendo achar o conteúdo pronto, só que isso não é algo que vai acontecer na vida real quando você tiver produzindo um jogo ou até mesmo um software. Você terá que ter esse pensamento lógico de como cada coisa pode funcionar. Como você ainda não tem, então bora pelo menos exercita como transformar a ideia lógica em programação.

                    • Eu acho mais fácil esse jeito que você esta me passando. O complicado são os códigos do unity que são diferentes do C#. Esse é mais pra lógica pra utilizar o método da unity: Ex: GetComponent, etc..Eu até tento pensar, mas não conheço os métodos completos utilizados pelo unity =/;; São tantos.. Voce poderia criar um tutorial dando exemplos de For,Foreach, While, entre outros utilizados pelo C# no sentido de como são utilizados dentro do game. Por exemplo: X é utilizado + pra texto (conversação) enquanto Y é mais utilizado pra controle de dano numa luta entre personagens, ou então Z é utilizado para fazer aquela contagem embaixo d’agua para não morrer afogado.
                      Ps: X,Y,Z foi só como exemplo msm =). Vai facilitar muito a vida das pessoas, inclusive eu.. haha

                    • o C# do Unity é exatamente igual ao C# de outros programas. A linguagem não muda, então o if/for/while que tu aprendeu no tutorial que está lendo de programação (Que não é foco do tutorial daqui) pode ser usado aqui também sem o menor problema.

                      Quanto aos comandos exclusivos do Unity, existe uma lista que eu fiz com algumas delas nesse post aqui, onde também falo um básico de programação C# (Não dá para fazer um curso avançado de C#, porque desvincula totalmente da ideia do tutorial e vai tornar o post mais um de vários posts na internet ensinando programação C#)

                      Programação C# para Unity

                    • Qual o comando pra ativar animação?

                    • Você já viu isso Tiago. Reveja a aula 4:
                      http://jogosindie.com/tutorial-unity-2d-animacao/

                      As animações são ativadas, quando você atende uma condição de transição saindo da animação atual. Os parametros são alterados pela classe animator e os métodos SetInteger, SetBool, SetFloat, SetTrigger

                    • Pra animação da bola girando, eu posso fazer tanto pelo animator como pelo animation? Ou tem restrição? Tipo, animator é só pra quem está no controle do objeto (tipo o próprio jogador-personagem)?

                    • Conseguir fazer a animação. Tive que criar uns sprites da bola girando pelo photoshop xD

                    • Se puder dar uma força. Quero saber como faz pra colocar uma força contrária à direção que o player está indo fazendo ele cair no chão (Quero colocar isso na bola que gira).

                      Outra coisa, diferente da bola. A plataforma de loop infinito está correndo muito bem, subindo e descendo. Mas tem 2 bugs. O primeiro é que a textura da plataforma quando sobe fica tremendo.
                      A segunda é que no momento que a plataforma chega na posição final Y e inverte a direção pra baixo (descer novamente), o player paira no ar enquanto a plataforma desce e depois começa a quicar na plataforma, sem ficar parado, enquanto ela se movimenta pra baixo. Como resolve esses 2 bugs?

                      E por final, gostaria de fazer com que as estalactite (igual a que nem no Zelda Majora’s Mask), sim, acrescentei no meu jogo. Continuando, queria saber como faz pra ela somente cair quando detectar a presença do player (personagem).

                      Desde já, agradeço sua atenção =)

                    • Arrumei o bug da plataforma do loop infinito ‘0’

  26. John Brandão disse:

    Boa tarde Carlos, to pra conhecer um cara paciente que você HUAHUSHUSAUHUASHSAUS
    Queria saber se tem alguma dica, meu cogumelo dependendo de como tenho contato com ele aumenta muito a força com que o meu personagem é lançado, tenho como manter essa força fixa ?

    • O meu, além de bugar na lateral jogando ele para o alto com uma força superior ao do script, o segundo pulo é muito baixo tendo que sair do cogumelo e pular novamente para ter uma altura legal igual do script. As vezes da esse outro bug de pular + alto que o script quando pulamos em cima do cogumelo =3

    • Boa noite John

      Cara, em relação ao pulo existe algumas possibilidades sim. Uma é tentar não usar o circle collider 2D e sim o box collider 2D. Outra seria fazer um timer antes de aplicar o Force, pois se o personagem já estiver subindo com uma força e vier outra força seu lançamento será mair.

  27. Eu posso declarar o valor de y, posicao inicial e final dentro de start?

    • Como eu coloco a posição do objeto em y declarando os vetores x, y e z?
      Eu fiz isso aqui:
      if (posicaoInicial =6)
      {
      transform.Translate(-Vector2.up * velocidade * Time.deltaTime);
      }

      Falta declarar a posição de y da posição inicial e final para funfar, só que não tenho a minima ideia de como fazer isso, porque nunca fiz antes. =3

      • você não precisa por o valor inicial e final de y em um Vector3.

        Em tutoriais que você já leu aqui, vimos como pegar o valor da posição de um objeto que está com o script. basta fazer transform.position, mais precisamente para pegar o valor de y fazemos transform.position.y. Esse y ai é do tipo float.

        Então pense um pouquinho, releia os tutorais que você já avançou e veja os scripts anteriores, tente entende-los, leia esse meu comentário e tente pensar como você vai comparar a posição do personagem com a posição inicial e final de y para defini se a plataforma vai subir ou descer.

    • Poder pode, mas não é o recomendado. Isso porque se você colocar no start, todas as plataformas irão respeitar a mesma regra.

      Você pode fazer isso de forma mais dinâmica deixando a variável como pública. Você está na metade do tutorial e desde o inicio eu mostro como deixar um valor mais dinâmico, então pense mais um pouquinho com o que eu falei acima, de como você vai resolver esse script para funcionar com diferentes plataformas nos cenários.

      • Consegui fazer ele subir, parar no ponto que quero e descer pro ponto inicial, só que ele continua descendo, não para no ponto inicial e reinicia o loop. Como faço pra fazer o loop infinito?

        //movimenta
        if (transform.position.y = posicaoInicial)
        {
        transform.Translate(-Vector2.up * velocidade * Time.deltaTime);
        transform.eulerAngles = new Vector2(180, 0);
        }
        }
        }

        • Deveria remover essa parada do site que faz cortar o código. é muito chato =/

          • O site não é desenvolvido por mim e sim pela ferramenta WordPress. Para desativar isso eu teria que mexer no código do WordPress e a cada atualização que tiver, refazer.

            Sem falar que algumas coisas simplesmente não iria mais funciona, como os comentários que eu adicionei imagem e link.

        • Esse código ainda apresenta um erro. Desta forma no if você está atribuindo o valor da posicaoInicial ao y da posição do objeto.
          = -> atribui valor
          == -> compara se é igual
          >= -> Compara se o valor é maior ou igual
          < = -> Compara se o valor é menor ou igual

          Pense um pouquinho sobre qual desses ai de cima você deverá usar. E o que precisa fazer para fazer ele fazer o movimento descendo. É bem parecido com o que foi feito e repito mais uma vez, é praticamente igual ao script de movimentação horizonta.

        • Eu coloquei certo, só q o site cortou a maioria do código, falta só fazer o loop infinito. Ele ta subindo até a posição Y que define no Inspector, e depois descendo. Só que ele não para na posição Inicial e faz o loop. Como faz o loop?

          • Mais uma vez não vou entregar a resposta, pense um pouquinho e veja os códigos já existentes e tente pensar.

            O metódo Update já funciona como um loop, que funciona enquanto o GameObject existir na aba Hierarchy. Então você apenas tem que informar que quando a posição dele em y for menor igual a tanto a direção será subindo. Depois quando a posição d y for maior ou igual a tanto, direção será descendo.

            Por fim, você verifica a direção for descendo eu vou usar -Vector3.up, se for subindo vou usar Vector3.up

  28. Como eu uso o IgnoreLayerCollision? Eu publico ele como class void … e adiciono o comando no update: Physics2D.IgnoreLayerCollision(LayerMask.NameToLayer(“Player”),LayerMask.NameToLayer(“Piso”), rigidbody2D.velocity.y > 0);

    Só que ele fala que precisa de body (corpo) pra funfar.. que merda é essa? E como adiciono isso?

  29. Prudencio disse:

    O meu estava bugando no cogumelo, nem sempre ele pulava (não disparava o OnCollisionEnter2D).

    Não sei se é a forma mais correta, mas resolvi esse bug e o pulo gigante com os eventos OnCollisionStay2D e OnCollisionExit2D, respectivamente.

    O ‘pulo gigante’ acontecia por colidir várias vezes (iniciando pela lateral e durante a subida) e continuar adicionando uma nova força ao player.

    Segue o código:

    using UnityEngine;
    using System.Collections;

    public class Cogumelo : MonoBehaviour {

    public float forcaPulo = 500f;
    private bool pulando = false;

    // Use this for initialization
    void Start () {

    }

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

    }

    void OnCollisionStay2D(Collision2D colisor) {
    if (!pulando) {
    pulando = true;
    colisor.gameObject.GetComponent ().AddForce (transform.up * forcaPulo);
    }
    }

    void OnCollisionExit2D (Collision2D colisor) {
    pulando = false;
    }

    }

    • Opa Prudencio. Na realidade não exista uma forma correta. Funcionando, está ótimo. ^^

      Outra coisa que pode ser feito é criar um Physics 2D Material com o Bounciness e aplica-lo no cogumelo.

      Existem diversas formas de fazer

  30. Prudencio disse:

    Colocando o carro na frente dos bois… 😛

    Pela forma correta, estou tentando imaginar a performance, quando o projeto começar a crescer… sei que o Update, por exemplo, tem um custo alto comparado aos eventos, e evito usá-lo em casos como este do cogumelo (que seria outra possível solução).

    Mas sou novato em Unity, então não tenho certeza se o que fiz seria bom nesse aspecto… mas funciona ^^

  31. Só queria falar que o application loadLevel era obsoleto na minha versão,então eu pesquisei e achei isso aqui,que funcionou:

    UnityEngine.SceneManagement.SceneManager.LoadScene(UnityEngine.SceneManagement.SceneManager.GetActiveScene().buildIndex);

    aparentemente esse é o jeito difícil de fazer(O cara até falou que não era pra usar)mas funciona.
    obs:minha versão é 5.3.4

    • Sim, o tutorial básico foi feito na versão 4.6 e muitas coisas não são mais usadas.

      O intermediário que já é no Unity 5.

      Quanto a declaração. No unicio do código você adiciona as linhas

      using UnityEngine.SceneManagement; (Igual aos imports do Java e acho que C++)

      Assim, nos códigos não vai mais precisar chamar o caminho inteiro, basta apenas:
      SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);

      ou name no lugar do buildIndex

  32. Carlos, só não se esqueça de atualizar o código para o script do Cogumelo para usuários de Unity 5 lá em cima.

    Aqui no seu comentário está correto, mas lá falta colocar parênteses após o RigidBody2D. Dá uma checada lá, pois meu programa não rodava devido à falta desses parênteses (); Agora ta rodando liso.

    Valeu pelo tutorial. É didático e muito bem elaborado!

    • Opa Matheus.

      Grato pelo comentário, mas na realidade não é um comando que precisaria ser refeito, mas sim o tutorial todo. Como assim? O tutorial foi criado em 2014 com a versão do Unity 4.6, porém de lá para cá já tem muita coisa nova e boa. O Script do cogumelo mesmo, na nova versão nem precisaria existir, pois já existe um componente no Unity que aplica o efeito de empurrar o personagem. Algo que apresento de forma rasa no tutorial intermediário (lançado inicio desse ano).

  33. Opa, estou seguindo o tutorial. Meu unity é pra ser o 5 e esta dando probleminha…
    É a respeito do “PlataformaCai”, o unity reclama que mesmo após destruído eu continuo tentado acessá-lo. Pelo que eu procurei na internet eu devo dar um jeito de anula-lo ou algo semelhante, mas não sei como fazer isso em código. Por favor alguém ajuda ‘-‘
    Exatamente o que está escrito no erro:
    ” MissingRegerenceException: The object of type ‘Transform’ has been destroyed but you are still trying to access it.
    Yout script shold either check if it is null or you shold not destroy the object. “

  34. Obrigado por responder e avisar que clicando duas vezes em cima aparece o código que tenta acessá-lo.
    O código é o seguinte:

    Vector3 novaPosicao = new Vector3 (player.position.x, player.position.y, transform.position.z);

    Ele fica no void Update desta forma:

    void Update () {
    Vector3 novaPosicao = new Vector3 (player.position.x, player.position.y, transform.position.z);
    transform.position = Vector3.Lerp (transform.position, novaPosicao, Time.time);
    }
    }

  35. Agora que eu vi, o erro está na Câmera. Mas eu não sei o porque ;-;

    O código que buga:
    Vector3 novaPosicao = new Vector3 (player.position.x, player.position.y, transform.position.z);

    Ele fica no void Update desta forma:
    void Update () {
    Vector3 novaPosicao = new Vector3 (player.position.x, player.position.y, transform.position.z);
    transform.position = Vector3.Lerp (transform.position, novaPosicao, Time.time);
    }
    }

    • Acredito que o player está nulo. Ou você não está pegando o player ou você o pega e depois destroi, consequentemente o conteúdo player.transform, não existe mais.

      Caso você destrua o player e crie um novo na scene, você tem que buscar novamente o Player e seta-lo na variavel, para atualizar a informação.

  36. Mas que coisa haha.
    Como que eu poderia consertar isso, pelo que eu devo procurar?
    Eu procurei por coisas que poderiam estar bugando, mas até agora não encontrei nada ;-;

    • tem pouca informação para eu encontrar o erro. Só se eu fizesse uma análise maior do código.

      Mas acredito que seja o que eu comentei mesmo. Você está destruindo o player e tentando acessá-lo ooooou está buscando componentes de outros objetos através do método Awake, ao invés do Start

  37. Lawliet disse:

    Carlos,meu jogo ao andar ele fica travando,executei todas as aulas anteriores com extremo cuidado,porem,mesmo assim,o boneco fica dando alguns lags quando anda.

  38. Gustavo disse:

    OnCollisionStay2D e OnCollisionExit2D devem estar no mesmo script do movimento da plataforma, tentei aqui e não consegui, tem que ter mais de um rigidbody no player??.

  39. Paulo Abecassis disse:

    Olá estou fazendo um game 2D para Windows Phone 10, e estou com o seguinte problema, na sua ultima aula quando toca na lava o personagem volta para a posição inicial, certo?. bom no meu caso não congelei o personagem na rotação por que quando ele cai de lado ou de cabeça para baixo fiz com que aparecesse uma animação qualquer, porem quando ele cai de lado na lava ele volta a posição inicial mas de lado. Minha pergunta é: como faço para que ele volte a sua posição inicial em pé.

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!