Menu
CoddyTech

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.
challenge icon

Desafio

Médio
  1. Em Tower, adicione dois campos serializados: head (um Transform) e turnSpeed (um float, em graus por segundo). O prefab ArrowTower fornece seu filho ArrowHead e 270.
  2. 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 turnSpeed graus por segundo.
  3. 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;
    }
}
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Jogo de Unity: Defesa de Torres