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.Sfida
Medio- In
Tower, aggiungi due campi serializzati:head(un Transform) eturnSpeed(un float, gradi al secondo). Il prefab ArrowTower assegna il suo figlio ArrowHead e 270. - Quando la torre ha un bersaglio, ruota la testa verso di esso, solo intorno all’asse verticale, al massimo di
turnSpeedgradi al secondo. - 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;
}
}
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.