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)
update()
{
transform.position += Vector3.right * speed;
}
Sabemos que isso fará o inimigo se deslocar para a direita infinitamente 5. 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()
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
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
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.
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)