Mirar
Lição 8 de 18 do curso Jogo de Unity: Defesa de Torres da Coddy.
Uma torre se vira para encarar seu alvo: não a torre inteira, que fica sobre sua base, mas sua cabeça, um objeto filho que carrega o cano. Girar um objeto filho gira tudo que está abaixo dele e deixa o objeto pai como está.
Os inimigos andam mais abaixo que as cabeças, então a direção de uma cabeça até seu inimigo aponta um pouco para baixo, e uma cabeça que olhasse diretamente nessa direção se inclinaria para a frente. Definir o y da direção como 0 a mantém nivelada, então a cabeça gira apenas em torno do eixo vertical. Uma lâmpada de farol que acompanha um navio:
Vector3 toShip = ship.position - lamp.position;
toShip.y = 0f;
lamp.rotation = Quaternion.LookRotation(toShip);Quaternion.LookRotation(direction) é a rotação que fica voltada para essa direção, então a lâmpada se vira para o navio de uma só vez. Já a cabeça de uma torre deve girar a uma certa velocidade: Quaternion.RotateTowards(from, to, maxDegrees), do capítulo sobre rotação, gira no máximo maxDegrees, e a velocidade de giro em graus por segundo multiplicada por Time.deltaTime fornece a parcela de cada quadro.Desafio
Médio- Em
Tower, adicione dois campos serializados:head(um Transform) eturnSpeed(um float, em graus por segundo). O prefab ArrowTower fornece seu filho ArrowHead e 270. - Enquanto a torre tiver um alvo, gire a cabeça em direção a ele, somente em torno do eixo vertical, em no máximo
turnSpeedgraus por segundo. - Sem um alvo, deixe a cabeça como está.
Pressione Play, construa torres ao lado do caminho e observe-as acompanharem os inimigos; em seguida, Check.
Experimente você mesmo
using UnityEngine;
public class Tower : MonoBehaviour
{
public int cost = 50;
public float range = 4f;
private Enemy target;
void Update()
{
target = FindTarget();
}
Enemy FindTarget()
{
Enemy nearest = null;
float nearestDistance = range;
foreach (Enemy enemy in Enemy.All)
{
float distance = Vector3.Distance(transform.position, enemy.transform.position);
if (distance <= nearestDistance)
{
nearest = enemy;
nearestDistance = distance;
}
}
return nearest;
}
}
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.