Menu
CoddyTech

Mira

Lezione 8 di 18 del corso Gioco Unity: difesa della torre di Coddy.

Una torre si gira per puntare al suo bersaglio: non l'intera torre, che poggia sulla sua piattaforma, ma la sua testa, un oggetto figlio che porta la canna. Girare un oggetto figlio fa ruotare tutto ciò che si trova sotto di esso e lascia invariato il genitore.

I nemici camminano più in basso rispetto alle teste, quindi la direzione da una testa al suo nemico punta leggermente verso il basso, e una testa che la seguisse guardando dritto si inclinerebbe in avanti. Impostare y della direzione su 0 la mantiene orizzontale, così la testa ruota solo attorno all'asse verticale. La lampada di un faro che segue una nave:

Vector3 toShip = ship.position - lamp.position;
toShip.y = 0f;
lamp.rotation = Quaternion.LookRotation(toShip);
Quaternion.LookRotation(direction) è la rotazione che punta in quella direzione, quindi la lampada si orienta subito verso la nave. Invece, la testa di una torre dovrebbe girare a una certa velocità: Quaternion.RotateTowards(from, to, maxDegrees) del capitolo Rotazione ruota al massimo di maxDegrees, e la velocità di rotazione in gradi al secondo moltiplicata per Time.deltaTime fornisce la quota di rotazione di ogni fotogramma.
challenge icon

Sfida

Medio
  1. In Tower, aggiungi due campi serializzati: head (un Transform) e turnSpeed (un float, gradi al secondo). Il prefab ArrowTower assegna il suo figlio ArrowHead e 270.
  2. Quando la torre ha un bersaglio, ruota la testa verso di esso, solo intorno all’asse verticale, al massimo di turnSpeed gradi al secondo.
  3. Se non c’è un bersaglio, lascia la testa com’è.

Premi Play, costruisci torri accanto al percorso e guardale seguire i nemici, poi premi Check.

Provalo tu

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 iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Gioco Unity: difesa della torre