Menu

Tutorial de Unity 2D – Controle da Vida do Personagem

Olá meus caros, tudo bem com vocês? No tutorial de hoje vamos aprender a fazer um pequeno sistema HP ou controle da vida do seu personagem!

Antes de iniciarmos, eu estive aqui pensando nos últimos tutoriais e vi que eles ficaram muito grandes, então resolvi mudar a estratégia,GetComponent de uma forma que vocês deveram gostar. As partes mais complicadas dos tutoriais já passaram, para a alegria de vocês, então pensei em fazer tutoriais menores (Não desanime ainda) e em contra partida, fazer tutoriais toda sexta-feira, o que acham?

Caso tenham gostado da ideia, já inclusive montei a agenda dos próximos tutoriais:

31/10 – Tutorial 7 – Sistema de Controle de Vida (Hoje).
07/11 – Tutorial 8 – Inimigos – Parte 1.
14/11 – Tutorial 9 – Inimigos – Parte 2.
21/11 – Tutorial 10 – Ataque Especial.
28/11 – Tutorial 11 – Áudios do jogo.
05/12 – Tutorial 12 – Mudar de Fase.
12/12 – Tutorial 13 – Salvar e Carregar (Save e Load) do jogo.

E com isso nosso primeiro tutorial acaba e eu entro de férias um pouco desses tutoriais e em Janeiro voltamos com outro tutorial que vocês vão escolher o que querem (Outra engine, Unity para Mobile, RPG Maker…) O que eu não souber, eu estudo para passar para vocês da forma como já estão acostumados aqui no Jogos Indie. E então, gostaram da ideia de ser semanal? Deixem ai nos comentários, se preferem assim semanalmente e mais curtos ou que eu continue fazendo quinzenalmente, porém mais aprofundado com mais exemplos (Como foi o cenário com vários tipos de coisas para interagir)

Bom, bora voltar ao nosso tutorial que é o que importa. Quanto à bandeira não vamos precisar dela hoje, apenas no tutorial de Mudar de Fase, então lá eu relembro a vocês como montar essa bandeira, para quem não conseguiu (Se bem que vamos ver animações em Ataque Especial e Inimigo também, então vocês vão revisar isso de qualquer jeito nos próximos tutoriais ^^).

Deixando de enrolação, vamos iniciar o tutorial. Como falei hoje vamos controlar o sistema de HP, ou seja, perder HP, recuperar HP e morrer! Além desse controle vamos criar um elemento GUI ou HUD.

Você sabe o que isso GUI? GUI vem do inglês Graphical User Interface, ou seja, Interface Gráfica do Usuário, logo é aquilo que não faz parte do nosso cenário, mas sim da interface do usuário. HUD é usado em jogos como Heads-Up Display que representa todo o conjunto da interface do usuário como HP, Munição, Arma, Mapa…

Vários jogos inclusive tem a opção Show/Hide HUD, que é usada para tirar aquele ScreenShot massa do jogo.

hud - corrida

Na imagem acima temos bastante conteúdo em nosso HUD:
– Ângulo de Inclinação
– Velocidade
– Mapa
– Volta

Ou seja, conteúdos que não fazem parte do cenário do jogo, imagine que são as coisas que o seu personagem não ver, apenas você como jogador.
Em um RPG, ou seja, um jogo que não é em primeira pessoa podemos ver como HUD:

Zidane - Final Fantasy

Os Status do usuário e a caixa de mensagem que sempre esta lá disponível na nossa visão, mesmo que a câmera mude de posição.
Dessa forma já podem perceber que esses conteúdos por não estarem no cenário, eles são “fixos” em uma posição na nossa câmera, certo? Sendo assim nosso HP será mostrado de forma fixa no cenário também.
Então para iniciar vou pedir para que vocês baixem a seguinte imagem:

sprite_hud_box

Essa pequena caixa, vai ser o local onde teremos a informação do HP do nosso personagem. Importem ela para o seu jogo na pasta texture:

01 - Vida - Import Texture

Assim que importa, vamos criar um novo objeto com o nome Vida:

02 - Vida - Menu Create

03 - Vida - Objeto Vida

Na Aba Inspector dentro desse objeto Vida vamos adicionar um GUIText (Add Component >> Rendering >> GUIText)

04 - Vida - Redering

05 - Vida - GuiText

Na Opção Text vamos usar o termo HP (Health Point)

6 - Vida - HP

Talvez você já o esteja vendo o texto em sua tela, mas se não tiver, basta mover as posições de X e Y (Normalmente aumenta-los), até visualiza-los na tela do seu jogo. Ah, e como um GUI não aparece no cenário do jogo, ele também não vai aparecer na aba Scene, apenas na aba Game.
Após localiza-lo na aba Game, o posicione na parte superior da tela do seu jogo através da Aba Inspector (Position X e Y).

7 - Vida - HP Posição

Caso, resolva apertar play, vai perceber que o HP acompanha a câmera e não fica para trás como o resto dos objetos na aba Hierarchy. Isso acontece porque estamos usando um componente GUI, que é aquilo que já expliquei sobre os HUD.

Usara apenas o HP fica feio, então vamos adicionar também um GUITexture (Add Component >> Rendering >> GUITexture). Escolha a textura que acabamos de importar para o nosso projeto.

8 - Vida - GUITexture

Dependendo do tamanho do seu cenário e personagens, pode ser que o sprite fique gigante:

9 - Vida - HUD sprite

Então podemos alterar a sua Scale (Escala) na aba Inspector, para ajustar ao tamanho correto:

10 - Vida - HUD posição

Após ajustar uma escala que deixa nossa imagem boa ao seu projeto, precisamos ajustar a sua posição em relação ao texto HP. Se mudarmos em Position, irá mover todo o conjunto, GUITexture e GUIText, e não é isso que queremos. Então no componente GUITexture altere o valor de X e Y na opção Pixel Insert:

11 - Vida - Posição HUD

Pronto, nosso HUD com a vida do nosso personagem está pronto. Se você tivesse vários conteúdos como Vida, Mana, Estamina, Armas… poderia criar um Objeto vazio só para juntar todos dentro dele como fizemos com o Player. Assim, se for oculta todos os conteúdos do HUD, ocultava apenas o Objeto principal.

Eu falei que nosso trabalho está pronto aqui no Unity, mas falta o script lá no MonoDevelop. Existe várias formas de fazer isso, alguns preferem criar um script só para o HP, outros para o HUD, mas como nós só temos um único conteúdo que envolve o personagem, então vou utilizar o próprio Script do Player, afinal a vida será dele. Neste caso abra o script do Player.
Aqui vamos precisar adicionar variáveis novas:

public GameObject vida;
public int maxVida;
private int vidaAtual;

Onde vida será o objeto que acabamos de criar com o GUITexture e GUIText. maxVida será o HP máximo do personagem (10, 50, 100, 1000…) e vidaAtual é o quanto ele tem de vida no momento do jogo.

Quando nosso personagem é criado, devemos dizer que a vidaAtual vai estar completa e mostramos no objeto Vida o quanto de HP o personagem tem, por isso atualizamos o nosso método Start para:

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

		//Vida
		vidaAtual = maxVida;
		vida.guiText.color = new Vector4(0.25f, 0.5f, 0.25f, 1f);
		vida.guiText.text = "HP: " + vidaAtual + "/" + maxVida;
	}

Explicando o código:

vidaAtual = maxVida;

Ao iniciar a fase, a vida atual do personagem será igual ao máximo que ele pode ter de vida, ou seja, estará com o HP completo.

vida.guiText.color = new Vector4(0.25f, 0.5f, 0.25f, 1f);

Dentro do objeto vida, estamos entrando no componente GUIText e na variável color, mudando esse valor para verde.

12 - Vida - Cor verde

O vetor 4 que usamos serve exatamente para representar isso aqui no Unity:

13 - Vida - Paleta de Cores

Ou seja: Vector4 (Red[Vermelho], Green[Verde], Blue[Azul], Alpha[Transparência]).

O verde que eu quero utilizar é um verde mais escuro, então ele tem certa de 25% de vermelho (0.25), 50% verde (0.5), 25% azul (0.25) e 100% sólido (1), por isso o: Vector4(0.25f, 0.5f, 0.25f, 1f).

Agora se eu quisesse um verde normal, poderia usar:

vida.guiText.color = Color.green;

Que me retornaria um vetor Vector4(0, 1, 0, 1), ou seja 100% verde, 0% Vermelho e Azul e 100% sólido.

vida.guiText.text = “HP: ” + vidaAtual + “/” + maxVida;

Neste caso, estou dizendo que o campo Text do objeto vida no componente GUIText vai receber “HP 100/100”, caso vidaAtual seja 100 e maxVida seja 100.

Agora precisamos criar os métodos para perder e recuperar vida, que são bem simples:

	public void PerdeVida(int dano) {
		vidaAtual -= dano;

		if (vidaAtual <= 0) {
			Application.LoadLevel(Application.loadedLevel);
		} 

		if ((vidaAtual * 100 / maxVida) < 30) {
			vida.guiText.color = Color.red;
		}

		vida.guiText.text = "HP: " + vidaAtual + "/" + maxVida;
	}
public void RecuperaVida(int recupera) {
		vidaAtual += recupera;

		if (vidaAtual > maxVida) {
			vidaAtual = maxVida;
		}

		if ((vidaAtual * 100 / maxVida) >= 30) {
			vida.guiText.color = new Vector4(0.25f, 0.5f, 0.25f, 1f);
		}

		vida.guiText.text = "HP: " + vidaAtual + "/" + maxVida;
	}

Vamos descomplicar esses métodos.
PerdeVida:

vidaAtual -= dano;

Nessa linha dizemos que a vidaAtual do personagem vai ser reduzia pelo dano que ele levou. O dano é passado como parâmetro na chamada do método PerdeVida(int dano). Logo se ele tem 100 de vida e levou um dano que 10 pontos, agora terá 90.

if (vidaAtual <= 0) {
Application.LoadLevel(Application.loadedLevel);
}
Se a vida atual do personagem for zero ou menor que isso (O dano foi maior do que a vida que ele tinha), então reiniciará a fase, por enquanto que não fizemos a parte de Game Over.

if ((vidaAtual * 100 / maxVida) < 30) {

    vida.guiText.color = Color.red;

}

Se a vida do personagem estiver abaixo de 30% mudamos a cor do texto para vermelho. Mostrando isso em forma de matemática, nada mais é do que uma regra de três que vemos no colégio:

maxVida = 100

vidaAtual = X

Multiplicamos isso usando a regra de 3:

maxVida * X = 100 * vidaAtual

X = (vidaAtual * 100)/ maxVida

Se X for menos que 30, o texto ficará vermelho.

vida.guiText.text = "HP: " + vidaAtual + "/" + maxVida;

Altera o texto do componente GUIText do Objeto Vida para “HP: 90/100” se ele levou um dano de 10 e estava com a vida cheia. Simples não? Agora vamos para o Script de RecuperaVida.

RecuperaVida

vidaAtual += recupera;

A vida atual do personagem irá receber um valor a mais de acordo com o valor passado no parâmetro recupera na declaração do método RecuperaVida(int recupera).

if (vidaAtual > maxVida) {
    vidaAtual = maxVida;
}
Como a vida atual não pode ser maior que a vida máxima (Embora já vi alguns jogos que podia O.o), significa que ser o valor estiver maior, por exemplo eu tinha 90 de vida e recuperei 50, para não ficar com 140/100, alteramos o vidaAtual para o mesmo valor de maxVida deixando: 100/100.

if ((vidaAtual * 100 / maxVida) >= 30) {
        vida.guiText.color = new Vector4(0.25f, 0.5f, 0.25f, 1f);
}

Vamos novamente a regra de 3 e verificamos se o valor atual da vida for igual ou maior que 30%, então mudamos o texto para verde (Aquele mesmo do método Start).

vida.guiText.text = "HP: " + vidaAtual + "/" + maxVida;

Por ultimo atualizamos o texto do objeto Vida.

Script pronto, então de volta ao Unity vamos dizer quanto é o maxVida e quem é o Objeto Vida:

14 - Vida - Setando dados no Script

Ah, eu não falei, mas se preferir pode transforma esse Objeto Vida em um Prefab, para facilitar adiciona-lo nas outras fases. Pronto, pode executar o jogo e verá que já mudará o texto para verde com HP 100/100

15 - Vida - HP

Agora, vamos perder e ganhar vida!

Lembram-se dos nossos Objetos Bola de Fogo e Lava? Vamos atualizar os scripts deles:

Script BolaFogo adicione o seguinte Collider:

void OnCollisionEnter2D(Collision2D colisor) {
	if (colisor.gameObject.tag == "Player") {
		var player = colisor.gameObject.GetComponent();
		player.PerdeVida(10);
	}
	Destroy (gameObject);
}

Quando a bola de fogo colidir com algo, ela será destruída, mas se esse objeto tiver a tag Player então:

var player = colisor.gameObject.GetComponent <Player>();

Iremos recuperar o componente Script Player do Objeto Player.

player.PerdeVida(10);

Iremos usar o método PerdeVida, que por ser public, pode ser acessado por outras classes também e iremos causar 10 de dano no personagem.
Agora no script do Objeto Lava, vamos alterar o método de colisão:

void OnTriggerEnter2D(Collider2D colisor) {
		if (colisor.gameObject.tag == "Player") {
			var player = colisor.gameObject.GetComponent();
			player.PerdeVida(player.maxVida);
		}
	}

Ou seja, quando o player tocar na lava, ele irá perder o equivalente ao valor máximo que ele pode perde e com isso a fase será reiniciada.

Ai tu pergunta, se faz a mesma coisa por que mudar, Carlos? Simples, porque ai quando fomos ajustar alguma coisa no Game Over, só precisamos ajudar tudo em um único canto, ao invés de sair procurando aonde tem Game Over. Melhor deixar tudo concentrado em um canto só, mais organizado.

Já perdemos vida, agora só falta recuperar vida, para isso vamos precisar adicionar um sprite novo:

sprite_potion

Importe para a pasta sprites:

16 - Vida - Sprite Poção

Crie um novo Objeto chamado Pocao e arraste o sprite_potion para dentro dele:

17 - Vida - Sprite Potion 2

Posicione o seu objeto em um local melhor, como sobre a segunda plataforma e adicione um RigidBody 2D e um Box Collider 2D:

18 - Vida - Pocao

Agora vamos montar o script da Poção. Vá na pasta Scripts e clique com o botão direito escolhendo Create >> C# Script.

19 - Vida - Criar Script

E adicione o nome Pocao.
Esse script é bem simples, ele só terá uma variável e um collider. A variável será vida:

public int vida;

Que serve para informar o quanto de vida essa poção irá recuperar. Deixando como publico, pois assim poderemos usar esse script em diferentes poções, uma que recupere 10, outra 50 e por ai vai.

Agora vamos fazer um método de colisão para o trigger:

void OnCollisionEnter2D(Collision2D colisor) {
	if (colisor.gameObject.tag == "Player") {
		var player = colisor.gameObject.GetComponent ();
		player.RecuperaVida(vida);
		Destroy(gameObject);
	}
}

Isso significa que se o objeto que encostar-se à poção tiver a tag Player, então ele irá pegar o script Player desse objeto e recuperar a vida dele de acordo com o que foi informado no Objeto Pocao. E depois destruir esse objeto, já que ele não é uma fonte de recuperar vida.

Para finalizar basta apenas voltar ao Unity e vincular o script Pocao ao Objeto Pocao e informar o quanto de vida ele recupera:

20 - vida - recuperando vida

Com isso nosso tutorial de Hoje esta terminado. Se vocês quiserem, pode crescer bem mais como, por exemplo, criar itens que aumente o maxVida e por ai vai.
Espero que tenham gostado e até semana que vem com o tutorial de Inimigos, onde iremos criar apenas 2, para não prolongar, um que apenas se move e você não pode tocar, e outro parado que fica atirando no personagem.

Até mais!

Player.cs

using System.Collections;

public class Player : MonoBehaviour {

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

	//Vida
	public GameObject vida;
	public int maxVida;
	private int vidaAtual;

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

		//Vida
		vidaAtual = maxVida;
		vida.guiText.color = new Vector4(0.25f, 0.5f, 0.25f, 1f);
		vida.guiText.text = "HP: " + vidaAtual + "/" + maxVida;
	}
	
	//Tudo que ocorre enquanto o personagem existe
	void Update () {
		Movimentacao();
	}

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

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

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

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

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

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

	public void PerdeVida(int dano) {
		vidaAtual -= dano;

		if (vidaAtual <= 0) {
			Application.LoadLevel(Application.loadedLevel);
		} 

		if ((vidaAtual * 100 / maxVida) < 30) {
 			vida.guiText.color = Color.red;
 		}
 		vida.guiText.text = "HP: " + vidaAtual + "/" + maxVida;
 	}
 	public void RecuperaVida(int recupera) {
 		vidaAtual += recupera;
 		if (vidaAtual > maxVida) {
			vidaAtual = maxVida;
		}

		if ((vidaAtual * 100 / maxVida) >= 30) {
			vida.guiText.color = new Vector4(0.25f, 0.5f, 0.25f, 1f);
		}

		vida.guiText.text = "HP: " + vidaAtual + "/" + maxVida;
	}
}

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") {
				var player = colisor.gameObject.GetComponent();
				player.PerdeVida(player.maxVida);
			}
		}
	}

BolaFogo.cs

using UnityEngine;
using System.Collections;

public class BolaFogo : MonoBehaviour {

	private float posicaoY = 0f;

	// Use this for initialization
	void Start () {
		Destroy (gameObject,2f);
		rigidbody2D.AddForce (transform.up * 400f);
		posicaoY = transform.position.y;
	}
	
	// Update is called once per frame
	void Update () {
		if (posicaoY > transform.position.y) { //Descendo
			transform.eulerAngles = new Vector2(180, 0);
		}
		posicaoY = transform.position.y;
	}

	void OnCollisionEnter2D(Collision2D colisor) {
		if (colisor.gameObject.tag == "Player") {
			var player = colisor.gameObject.GetComponent();
			player.PerdeVida(10);
		}
		Destroy (gameObject);
	}
}

Pocao.cs

using UnityEngine;
using System.Collections;

public class Pocao : MonoBehaviour {

	public int vida;

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

	void OnCollisionEnter2D(Collision2D colisor) {
		if (colisor.gameObject.tag == "Player") {
			var player = colisor.gameObject.GetComponent();
			player.RecuperaVida(vida);
			Destroy(gameObject);
		}
	}
}

Parte 6 – Cenário parte 2

Indice Unity 2D

Parte 8 - Inimigo parte 1

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

74 comments

  1. Paulo disse:

    Muitos parabéns, a partir de agora terá mais um seguidor. Simplesmente adorei os seus tutorias com conteúdo muito interessante e excelentes explicações. Já vi muitos tutoriais mas mesmo muitos (ate em inglês) e em poucos encontrei tão boas explicações.
    Boa continuação….

  2. Paulo disse:

    Ola Carlos, estou aqui com dois problemas. O guiTexture fica por cima do guiText, ou seja nao vejo o texto, ja tentei varias coisas mas sempre que inicio o jogo o texto desaparece. O outro penso que tb ja deves ter reparado, que quando a bola de fogo colide com o player ela exerce uma força ao player, projectando para baixo ou para cima. Consegues corrigir isso??. Obrigado pela atençao.

    • E aê Paulo, tudo de boa?

      Então, bora resolver essas bronca!

      1 – o GUITexture Acima do GUIText. Clique sobre o objeto (Eu creio que você esteja falando do objeto Vida) na aba Hierarchy e dentro da Aba Inspector clique com o botão direito sobre o componente GUITexture (OU clicque naquela engrenagem do lado de um livro com interrogação no componente).

      Você vai ver algumas opções, escolha a Move Down, atééé que o GUITexture fica abaixo do GUIText. O componente que estiver mais acima, é o que ficará na frente, entendeu? Senão, eu tiro uns prints, a questão é só deixar o GUIText primeiro (acima) do que o GUITexture.

      2 – Senão quiser que ela exerça força alguma, você pode optar por usar a opção Is Trigger, agora lembre-se de trocar o método de collider de OnCollisionEnter2D para OnTriggerEnter2D, beleza?

  3. Bruno disse:

    Mano eu posso fazer videos tutorias com o seu conteúdo e na descrição do vídeo eu coloco seus créditos??

  4. Bruno disse:

    vou começar a fazer!

  5. Marcos Cruz disse:

    fala Carlos voltei à acompanhar seus tutorias, fique meio sem tempo devido ao trampo, mas estou devolta aos estudo.

    cara vendo este tutorial esta acontecendo o seguinte erro:

    Assets/Script/ObjetosInterativos/Lava.cs(28,57): error CS0411: The type arguments for method `UnityEngine.GameObject.GetComponent()’ cannot be inferred from the usage. Try specifying the type arguments explicitly.

    com o BolaFogo também acontece o mesmo erro:

    Assets/Script/ObjetosInterativos/BolaFogo.cs(25,57): error CS0411: The type arguments for method `UnityEngine.GameObject.GetComponent()’ cannot be inferred from the usage. Try specifying the type arguments explicitly

    tem como da uma ajuda fera?

    • Marcos Cruz disse:

      aqui o Script que estou usando para o Player

      using UnityEngine;
      using System.Collections;

      public class Player : MonoBehaviour {
      public float velocidade;
      public float forcaPulo;

      private bool estaNoChao;
      public Transform chaoVerificador;

      public Transform player;
      private Animator animator;

      public GameObject vida;
      public int maxVida;
      private int vidaAtual;

      // Use this for initialization
      void Start () {
      animator = player.GetComponent ();

      //vida
      vidaAtual = maxVida;
      vida.guiText.color = new Vector4(0.25f, 0.5f, 0.25f, 1f);
      vida.guiText.text = “HP:” + vidaAtual + “/” + maxVida;

      }

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

      void Mover (){
      estaNoChao = Physics2D.Linecast(transform.position, chaoVerificador.position, 1 < 0 ) {
      transform.Translate (Vector2.right * velocidade * Time.deltaTime);
      transform.eulerAngles = new Vector2(0, 0);
      }
      //IR ESQUERDA
      if (Input.GetAxisRaw(“Horizontal”) < 0 ) {
      transform.Translate (Vector2.right * velocidade * Time.deltaTime);
      transform.eulerAngles = new Vector2(0, 180);
      }
      //PULO
      if (Input.GetButtonDown("Jump")&& estaNoChao) {
      rigidbody2D.AddForce(transform.up * forcaPulo);
      }

      // ANIMAÇOES PARA CONDIÇOES DE PULAR E CAIR
      if (estaNoChao == false) {
      if(rigidbody2D.velocity.y 0)
      animator.SetBool (“pulando”, true);
      }

      if (estaNoChao == true) {
      animator.SetBool (“caindo”, false);
      animator.SetBool (“pulando”, false);
      animator.SetFloat (“correr”, Mathf.Abs (Input.GetAxis (“Horizontal”)));
      }

      }
      //PERDE VIDA
      public void PerdeVida(int dano) {
      vidaAtual -= dano;

      if (vidaAtual <= 0) {
      Application.LoadLevel(Application.loadedLevel);
      }

      if ((vidaAtual * 100 / maxVida) maxVida) {
      vidaAtual = maxVida;
      }

      if ((vidaAtual * 100 / maxVida) >= 30) {
      vida.guiText.color = new Vector4(0.25f, 0.5f, 0.25f, 1f);
      }

      vida.guiText.text = “HP: ” + vidaAtual + “/” + maxVida;
      }

      }

      • vish! O teu erro é coisa besta, mas foi falha minha, quando eu passei o código para aqui no WordPress algumas coisas sumiram.

        Em GetComponent() você tem que passar o nome do componente que se deseja pegar entre <>:
        GetComponent(); //Pega o Script

        ou

        GetComponent(); // Pega o animator

        Vou ver se arrumo esse bug ai no código que está na página.

        Valeu por comentar, senão nem teria percebido que esses valores sumiram 😉

  6. Marcos Cruz disse:

    e por fim e para reduzir linhas o script da Lava e BolaFogo é exatamente o mesmo do seu,

    aqui é onde ocorre o erro no BolaFogo
    var player = colisor.gameObject.GetComponent();
    player.PerdeVida(10);

    e aqui é onde ocorre o erro da Lava
    var player = colisor.gameObject.GetComponent();
    player.PerdeVida(player.maxVida);

    conto com sua ajuda man.

    • É a mesma coisa do de cima:
      colisor.gameObject.GetComponent();

      Foi mal, vou ajudar e verificar nos outros códigos que sumiram também.

      Mas em resumo é, você informa o que quer recupera no GetComponent passando o campo entre <>

    • Nos comentários também não vai -.-‘

      colisor.gameObject.GetComponent < Player > ();
      Sem o espaço entre o Player e as <>

      • Marcos Cruz disse:

        wow man só tu mesmo pra me responder no mesmo diai, deu certo aqui, a bendita tag tinha sumido mas agora esta funcionando perfeitamente.

        quando eu conseguir criar meu primeiro game pode ter certeza que te darei todo os créditos afinal sem seus tutorias eu ainda não teria chegado até aqui, ainda estaria penando com os pulos infinitos e animações bugadas xD

        vlw mesmo ! ! ! ! !

        • Quando joguei no WordPress, ele pensou que o conteúdo era uma Tag html e sumiu u.u

          Mas resolvido agora o/

          E nem esquenta não com os créditos, o reconhecimento de vocês já é tudo para mim ^^

  7. Karfann Nacif disse:

    Parabéns pelos tutoriais Carlos!
    Comecei estudar unity pra fazer meu TCC – jogo 2D android e tenho aprendido muita coisa por aqui!
    Continue assim e obrigado pela ajuda!

  8. Carlos, estou com um problema que não consigo resolver, no código da Lava. Aparece: ‘Player.maxVida’ é inacessível devido ao seu nível de proteção (CS0122).

    O código segue idêntico ao seu e não consigo entender o erro. Me ajuda por favor. Eu li todos os comentários, alguns se parecem com o meu mas não deram certo também.

  9. Victor Hugo disse:

    Boa tarde Carlos! Aqui estou eu novamente, dei uma desanimada nos ultimos dias mas estou querendo voltar rs, seguinte… antes de parar de mexer no meu joguinho eu fiz o player atacar e talz, como falei num outro post eu tive que fazer um delay pro tiro acompanhar a animação, eu tbm limitei o tempo em que o jogador pode “atirar”(é uma espécie de hadouken), fiz com que o player tivesse “energia”, qndo a energia esta cheia o player pode lançar o “hadouken”, porém eu tentei fazer com que a energia aparecesse na tela, e com o tempo ela se regenerasse… mas ela buga ‘-‘. fora da tela vai normal, eu tenho q esperar +- 5segundos para poder atacar dnv, mas na tela não aparece o regen… fica um numero fixo na tela =s
    algumas vezes aparece 17.xxx, ou 50.xxx, ou 40.xxx
    Sendo que o limite de energia também seria 50 rs.

    Tem como dar um help nisso? fazer minha energia aparecer na tela e se regenerar com o tempo?

    • Não entendi o que você quis dzer com na tela e fora da tela .-.

      O que você está falando de exibir a energia na tela é a mesma coisa do hp? (GUIText e GUITexture?)

      • Victor Hugo disse:

        desculpa, sim isso, eu coloquei uma GUItext na tela para exibir a energia/mp, porém qndo eu começo ele exibe um valor fixo, não importando a ação que eu faça… por exemplo, eu ataquei, ao invez dele consumir a mana, na tela permanece o numero inicial.

        o na tela e o fora da tela eu me refiro a seguinte situação:

        na tela esta escrito 50, por exemplo, mas ao atacar ele não se altera

        fora da tela ele altera, entendeu? no script quando eu ataco ele faz tudo normal, como se eu realmente tivesse gastado mana e estivesse recuperando, porém a tela(a parte da GUIText) permanece a mesma

  10. Ariel Santos Moraes disse:

    E ai Carlos, primeira coisa cara, melhor tutorial que achei até hoje foi o teu cara, ta muito bom mesmo.

    Cara ve se pode me tirar uma duvida.

    Até agora fiz tudo exatamente igual o que tu fez, só tem um problema, quando o player morre, e é chamado o Application.LoadLevel, o GUItext fica atraz do GUItexture, não consigui ainda descobri o por que disso.

    Tem alguma ideia do que possa ser?

    • Ariel Santos Moraes disse:

      Descobri, se não criar como um Prefab ele tem esse comportamento, não entendi o sentido nisso

      • Opa Ariel, beleza?

        Valeu mesmo pelo comentário ^^

        Quanto a sua dúvida, verifica se o GUItext está acima do GUItexture na aba Inspector. Se não tiver joga ela para frente.

        Se tiver, então depende de como estiver o seu código. Qualquer coisa manda para meu e-mail (carlos@jogosindie.com) que eu dou uma analisada mais profunda ^^

      • Ariel e todo mundo que tiver tendo problema com o posicionamento. Aparentemente algumas coisas mudaram desde que fiz essa parte, então vocês podem optar por criar um novo objeto filho de Vida, no qual ele irá ficar responsável apenas pelo guiTexture. Ai vocês definem a posição desse objeto em Z para -1

  11. Izaldo disse:

    O meu ta dando o seguinte erro:

    NullReferenceException: Object reference not set to an instance of an object
    MoveBehaviour.OnCollisionEnter2D (UnityEngine.Collision2D bloco) (at Assets/Script/MoveBehaviour.cs:124)

    Eu to fazendo de maneira que, quando o objeto (bloco) tocar no chão ele cause dano.
    pra isso eu criei um script chamado vida que sta no meu gameobject com a barra de hp,
    e o script MoveBehaviour que esta no gameobject bloco

    Script:

    void OnCollisionEnter2D (Collision2D bloco){

    if (bloco.gameObject.tag == “chao”) {
    var player = bloco.gameObject.GetComponent();
    player.PerdeVida(10);
    }
    }

  12. troca por isso aqui:
    var player = bloco.gameObject.GetComponent < Player >();

    Remove os espaços entre as <>.

    SUmiu, pois ele interpretou como se fosse uma tag html

  13. Claudimarcio Doniseti Dias. disse:

    Carlos excelente tutorial, parabéns pelo seu trabalho, quem dera se todos os tutoriais tivessem a mesmo intenção de ensinar.

    Por favor , estou com um problema, o componente GUI text inserido no GameObject vida não aparece na tela mesmo digitando qualquer frase, não é possível redimensiona-lo ou outra ação, o mesmo acontece com GUI texture. Mas se eu fizer um componente GUI text via script e adiciona-lo no GameObject quando eu inicio o jogo, o texto criado no script aparece.

  14. carloswgama disse:

    Nesse exemplo ai que eu fiz, eu utilizei o GUIText e o GUITexture tudo no mesmo objeto. Algumas pessoas tiveram o problema da Texture ficar em cima do Text mesmo invertendo a ordem (Acho que por conta das versões).

    Neste caso eu recomendo que você crie dois objetos um para a textura e outro para o texto. Ai o problema é resolvido 😉

  15. Claudimarcio Doniseti Dias. disse:

    Mesmo criando um GameObject para cada um, o problema persiste, as letras digitadas no campo text do GuiText não aparecem na tela do Scene e na tela Game quando inicio o jogo.

    Por favor se puder responder tenho outra duvida mas não é referente ao tutorial:
    -Tenho mais de um projeto criado, e quando saio de um projeto e abro outro tanto o projeto que abro como o que deixei perdem todos os GameObject criados.
    A medida que vou desenvolvendo o projeto sempre vou em file => salve project. mas não esta resolvendo o problema.

  16. carloswgama disse:

    Ah tá, entendi agora o seu problema.

    Não, ele não aparece na tela do Scene mesmo. Ele apenas aparece na tela Game quando se inicia o jogo. Isso ocorre porque o GUI não faz parte na realidade do cenário, ou seja é algo que seu personagem não pode interagir ou ver, é algo que apenas o jogador pode ver quando estiver jogando, por isso que ele apenas aparece na tela do Game e não na da Scene.

    Segunda pergunta:
    Além do Save Project, você precisa ir em Save Scene.
    Save Project irá salvar todas as alterações realizadas na aba Project ou em Preferencias.
    O Save Scene irá salvar todas as modificações da Scene, ou seja, objetos adicionados e removidos.

    Espero ter ajudado 😉

  17. Claudimarcio Doniseti Dias. disse:

    .
    Nossa como sou leigo!!!! obrigado pela ajuda.
    No caso do texto andei lendo a documentação do Unity e consegui utilizar o UI => Text no lugar do Gui Text, e também um vídeo sobre a manipulação do Canvas, mas valeu em muito as suas respostas.

  18. arley280 disse:

    Mano quando diminuo ou aumento o tamanho da tela os guitext fica fixo, nao diminui ,nem aumenta.
    como resolver isso?

  19. Luiz Henrique disse:

    Alguem tem o trabalho pronto até a parte 7 pra passar ?? eu tava fazendo aqui mas meu PC deu pau e acabei perdendo…Se alguem puder passar agradeço. meu E-mail “Luizhr150@gmail.com” 😀

  20. Lucas disse:

    Cara to acompanhando todos seus tutoriais, porem estou usando o unity 5.1e os códigos são muito diferentes, da muitos erros de códigos como este –> Type `UnityEngine.GameObject’ does not contain a definition for `GUIText’ and no extension method `GUIText’ of type `UnityEngine.GameObject’ could be found (are you missing a using directive or an assembly reference?)
    Algumas vezes consigo resolver, mas como não entendo muito sobre programação nem sempre consigo, ai tenho q comentar o código e continuar, o que devo fazer?

  21. carloswgama disse:

    Eu ainda não mexi muito no Unity 5.1. O novo tutorial que eu fizer (Ainda vai demorar um pouco), será já no 5.

    Esses erros que tal conteúdo não existe, acredito que seja resolvido com o: var guiText = GetComponent<GUIText>();

    Antigamente o GameObject ele já vinha com alguns métodos e variaveis já prontas como o rigidbody2d, addForce e deve ser o caso também do guiText.

    Ou seja a partir do 5, tudo que é componente, tem que ser acessado via GetComponent<NomeDoComponente>()

  22. Lucas disse:

    Ok, entendi, muito obrigado pela ajuda

  23. Gabriel Barcellos disse:

    Primeiramente, parabéns pelos tutoriais, são muito bons mesmo (bem melhor que as chatices que se encontra na internet). Infelizmente eu sou um dos que tem encontrado bastante problema no código devido a diferença para a unity 5.x.

    Já de início este tutorial não funfou por causa do GUIText… e a forma como foi inserido o objeto tb não rolou por não conter o componente Rect Transform…

    Vou compartilhar aqui como resolvi, não é a melhor forma do mundo, com certeza existem outras mais “elegantes”, mas o importante é que funfa.

    Então, pra criar o objeto e depois associar o texto, tem que ir em GameObject -> UI -> Text. Assim ele cria o elemento Canvas, que é quem “segura” os componentes da UI, além de já criar o elemento Text dentro dele já com o componente Rect Transform.

    A imagem eu fiz parecido, GameObject -> UI -> Image.

    O maior problema foi manipular os dois via script. Não funcionou nem UI nem GUIText. Deixei duas variaveis públicas no script (HP_txt/HP_img) para passar por parâmetro os elementos de texto e imagem da HP e usei o seguinte código para manipula-las:

    HP_txt.GetComponent<Text>().color = new Vector4(0.25f, 0.5f, 0.25f, 1f);
    HP_txt.GetComponent<Text>().text = “HP: ” + vidaAtual + “/” + maxVida;

    P.S.: tem que incluir biblioteca UI no início do script senão não vai funcionar:
    using UnityEngine.UI;

    Espero ter ajudado

    • Concordo plenamente como também não recomendo criar um jogo na versão 4.6.

      Ele ainda serve para você aprender o básico, mas para criar mesmo é melhor usar a nova versão que trabalha com o canvas. No inicio do ano que vem, acho que no máximo fevereiro devo estar lançando um novo tutorial compatível com a versão 5 e mais puxado.

  24. Gabriel Barcellos disse:

    P.S.2: ali onde diz “HP_txt.GetComponent().text…” antes do parenteses era pra ter um sinal MAIOR Text MENOR, deixei espaço entre os sinais mas mesmo assim foi considerado como tag html.
    Sorry!

  25. Gutemberg disse:

    Meu projeto deu tudo certo mas já era pra bolas de fogo atingirem o personagem ?porque elas sobem e descem e nao o atingem..

    • É por contado do Is Trigger no Collider da Bola de Fogo.

      Caso use o Is Trigger ao invés de usar o OnCollisionEnter2D(Collision2D colisor), você precisa usar OnTriggerEnter2D(Collider2D colisor) ^^

  26. John Brandão disse:

    Carlos, me salva.
    Decidi não usar o sistema de hp por conta da versão do unity que estava usando, algumas coisas no código não funcionavam. porém, não sei o que fiz, mas meu player não se movimenta mais de jeito nenhum, não importa o que eu faça, se puder me ajudar, não quero parar o tutorial agora 🙁

    agora quando dou play, aparecem as seguintes mensagens no console
    The referenced script on this Behaviour is missing!
    The referenced script on this Behaviour (Game Object ‘Player’) is missing!

    • John, esse erro ai acontece quando você adicionou ao seu script através do Inspector um objeto por referência e depois o excluiu da sua aba Hierarchy. Ou seja, ele está tentando acessar um objeto que não existe. Veja lá no seu player no script o que você removeu e remova ele do código.

  27. John Brandão disse:

    VALEUUUUU Carlos.

    Acho que por conta da versão vou manter meu jogo sem o sistema de HP, estou apanhando muito para os códigos.

    • acho ainda dá para fazer desta forma, mas nem recomendo tanto aprender a usar o estilo desse tutorial, pois acho que em próximas versões nem vai existir mais.

      Ano que vem sai o próximo tutorial, usando barra de vida.

  28. Na nova versão do unity tem que usar vida.GetComponent().color ou GetComponent().text =) ….E no final adicionar + maxVida;. Vc esqueceu de adicionar só o sinal de +, pra funfar. xD

  29. Eu usei essa colisao aqui: void OnCollisionEnter2D(Collision2D colisor) no script da bola de fogo mas ela não atinge meu personagem, ele não perde vivo nisso. Minha opção Is Trigger está desativada. Sabe o que seja?

  30. brun094_figueiredo@hotmail.com disse:

    Eu queria perguntar sobre a imagem que vc usou para para ser a caixa onde é mostrada a vida, vc fez a imagem ou apenas achou ? Eu queria fazer uma parecida mas de outra cor, então se vc fez a imagem pode me dizer com q programa vc fez ela ?

  31. Nicolas de Oliveira disse:

    Nem o meu GUI Text nem o meu GUI Texture aparece, você poderia me ajudar ?

    • Opa Nicolas. Tanto o Text quanto o Texture só aparecem na aba Game.

      Entretanto, eu recomendo que está parte do tutorial você desconsidere, uma vez que na versão atual 5, já não é mais utilizada. Ao ver o tutorial intermediário, você poderá ver o novo sistema de UI usando o canvas, que é bem melhor e o sistema atual ^^

  32. Julio Cesar disse:

    Galera pra quem quer usar este método apresentado no tutorial e não ta conseguindo fazer “colisor.guiText.color” use “colisor.GetComponent().Color”. Nas novas versões do unity não aparece mesmo. Soh pra constar: não são colchetes são simbos de maior e menor, igual no html

  33. Lawliet disse:

    public float velocidade;
    public float forcaPulo;
    private bool estaNoChao;
    public Transform chaoVerificador;
    public Transform spritePlayer;
    private Animator animator;
    public GameObject life;
    public int maxLife;
    private int currentLife;

    // Use this for initialization
    void Start(){
    animator = spritePlayer.GetComponent();
    ///Vida
    currentLife = maxLife;
    Life.guiText.color = new Vector4(0.25f, 0.5f, 0.25f, 1f);
    Life.guiText.text = “HP: ” + currentLife + “/” + maxLife;
    }

    Estou com problemas na parte ” Life.guiText.color = new Vector4(0.25f, 0.5f, 0.25f, 1f) Life.guiText.text = “HP: ” + currentLife + “/” + maxLife;

    o unity diz que não existe o Life e isso gera um erro incapaz de compilar o código,pode ajudar?

  34. Jose Soares Ramos Junior disse:

    Opa Carlos, blz? To com um pequeno problema, quando o player morre que dá o reload o HP desaparece…

    • Deve ser a ordem que ele está colocado o HP e a textura atrás. Maaaas essa parte de GUI, você desconsiderar, pois na versão 5 do Unity, já não a usamos mais. Usamos outro sistema

  35. Lawliet disse:

    Mas se eu colocar “life” com letra minusculam,no caso a variavel,ele deixa uma linha inteira como errada,já “Life”,diz apenas que ele está errado e uso atualmente a versão mais recente.

  36. Fejao disse:

    Carlos estou com um problema meu personagem não perde nem ganha vida

  37. miranda disse:

    Talvez você já o esteja vendo o texto em sua tela, mas se não tiver, basta mover as posições de X e Y (Normalmente aumenta-los), ? sim x y de onde mesmo?

    • Então Miranda,

      Eu não recomendo mais usar o GUI baseado no Unity 4.6, porque no 5 já tem um sistema UI bem melhor (No tutorial intermediário tem ele), mas caso queira ainda sim trabalhar com esse GUI, os valores de X e Y é do campo Position lá no Inspector 😉

  38. miranda disse:

    blz mais não ele nem da sinal de vida, tipo ele esta la mas não aparece! o tutorial intermediário e aquelas opção alternativas deste mesmo tutorial ou vc tem outro na versão 5? se tiver me passe o link por favor pq estou a dias tentando finalizar esta etapa !!! obrigado pela atenção!!

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!