Inimigos e UI
·Inimigos
Vamos adicionar uma ameaça ao nosso jogo na forma de um inimigo que fica andando de um lado para o outro
- Crie um novo objeto e dê o sprite que quiser
- Adicione um Collider2D e customize o formato
Queremos que esse inimigo fique andando de um lado para o outro, se movendo até uma posição expecífica e trocando de direção
- Crie um novo script de movimentação para seu inimigo
- Insira o seguinte código dentro de Update() (e defina a variável speed no início da classe)
void Update() { transform.position += Vector3.right * speed; }
Sabemos que isso fará o inimigo se deslocar para a direita infinitamente
- Para definir os limites do seu movimento, crie as seguintes variáveis no início da classe
public Vector3 startPosition;
public Vector3 endPosition;
private int direction = 1;
E adicione este código em Update()
void Update()
{
transform.position += Vector3.right * speed * direction;
if (Vector3.Distance(transform.position, startPosition) <= 0.1f) // if acontece quando o inimigo está dentro de 0.1 unidades de distância da posição final
{
direction = 1; // Direção = direita
}
if (Vector3.Distance(transform.position, endPosition) <= 0.1f) // if acontece quando o inimigo está dentro de 0.1 unidades de distância da posição final
{
direction = -1; // Direção = esquerda
}
}
⚠ Note que simplesmente fazer “transform.position == endPosition” não vai funcionar devido as posições serem floats, é possível que o inimigo ultrapasse a posição final sem que a condição se torne verdadeira
Prefabs
Agora que temos nosso objeto inimigo criado, podemos querer ter varios inimigos idênticos espalhados pela fase, todos com as mesmas propriedades.
Podemos fazer isso simplesmente copiando e colando o inimigo por ai, mas uma forma muito mais prática é tornar o inimigo em um prefab(pre-fabricated object), um inimigo pronto que podemos adicionar à fase sempre que precisarmos.
Outra vantagem de prefabs é que alterações ao prefab se aplicam a todas as suas instâncias na fase, ou seja, podemos, por exemplo, mudar o sprite do inimigo alterando somente o prefab, sem ter que achar todos os inimigos no nível e alterar seus sprites individualmente(também é possivel modificar instâncias expecíficas de prefabs).
- Para fazer isso, simplesmente arraste seu objeto inimigo da Hierarchy para o local desejado na janela Project
Se tudo der certo, o inimigo irá aparecer dentre os seus arquivos e o inimigo já existente ficará com texto azul
Dano
Precisamos que os inimigos interajam com o jogador de alguma forma, a mais clássica sendo que eles dêem reduzam a vida do jogador
- Vamos primeiro adicionar HP ao script do jogador
public float playerHealth = 100.0f;
Agora queremos detectar quando o jogador colide, expecificamente, com um inimigo.
Para isso, precisamos definir o que é um inimigo
- No inspector do inimigo, atribua a ele uma tag (pode ser a tag “Enemy” existente ou uma nova)
- No script do jogador, adicione o seguinte código dentro de OnCollisionEnter()
private void OnCollisionEnter2D(Collision2D other) { if (other.contacts[0].normal == Vector2.up) { currentJumps = 0; //isJumping = false; } if (other.gameObject.CompareTag("Enemy")) { playerHealth -= 20; Debug.Log("OUCH " + playerHealth); } }
Colidir com o inimigo reduzira a vida do jogador em 20 e escrevera uma mensagem no console com sua vida atual.
UI
Não basta apenas exibir a vida do jogador no console, pois essa ferramenta só está disponível para nós desenvolvedores. Para que o player seja capaz de ver sua própria vida, precisamos adicionar um HUD
- Crie um novo objeto UI > Canvas.
- Dê um clique duplo nesse novo objeto. Este vai ser o lugar onde você ira criar sua UI
⚠ Não se alarme pelo tamanho do canvas, não é necessário reduzí-lo
- Dentro do seu objeto canvas, crie um novo objeto UI > Text
- Edite o texto como quiser, a posição do texto no canvas equivalerá a sua posição na tela do jogador
(Mudar as opções de Overflow vertical e horizontal para “overflow” pode facilitar)
- Dentro do script do jogador, nas primeiras linhas, insira o seguinte código
using UnityEngine.UI;
- Declare a seguinte variável pública
public Text playerHealtText;
(Defina essa variável no editor arrastando o objeto texto até a caixinha no script do jogador)
- Dentro de if em OnCollisionEnter(), faça a seguinte alteração (dentro do segundo ‘if’)
private void OnCollisionEnter2D(Collision2D other) { if (other.contacts[0].normal == Vector2.up) { currentJumps = 0; //isJumping = false; } if (other.gameObject.CompareTag("Enemy")) { playerHealth -= 20; Debug.Log("OUCH " + playerHealth); playerHealtText.text = ("HP: " + playerHealth); } }
Agora a vida no HUD irá atualizar sempre que o player tomar dano! (mas note que nada a impede de ficar negativa)