Apuntar
Lección 8 de 18 del curso Juego de Unity: defensa de torres de Coddy.
Una torre gira para mirar a su objetivo: no toda la torre, que permanece sobre su plataforma, sino su cabeza, un objeto secundario que lleva el cañón. Al girar un objeto secundario, gira todo lo que hay debajo de él, mientras que el objeto principal permanece igual.
Los enemigos caminan más abajo que las cabezas, así que la dirección desde una cabeza hasta su enemigo apunta un poco hacia abajo, y una cabeza que mirara directamente en esa dirección se inclinaría hacia delante. Establecer en 0 la y de la dirección la mantiene nivelada, así que la cabeza solo gira alrededor del eje vertical. La lámpara de un faro que sigue a un barco:
Vector3 toShip = ship.position - lamp.position;
toShip.y = 0f;
lamp.rotation = Quaternion.LookRotation(toShip);Quaternion.LookRotation(direction) es la rotación que apunta en esa dirección, así que la lámpara se orienta hacia el barco de inmediato. En cambio, la cabeza de una torre debería girar a cierta velocidad: Quaternion.RotateTowards(from, to, maxDegrees), del capítulo sobre rotación, gira como máximo maxDegrees, y una velocidad de giro en grados por segundo multiplicada por Time.deltaTime da la parte correspondiente a cada fotograma.Desafío
Intermedio- En
Tower, añade dos campos serializados:head(un Transform) yturnSpeed(un float, grados por segundo). El prefab ArrowTower asigna su hijo ArrowHead y 270. - Mientras la torre tenga un objetivo, gira la cabeza hacia él, solo alrededor del eje vertical, como máximo
turnSpeedgrados por segundo. - Si no hay ningún objetivo, deja la cabeza tal como está.
Pulsa Play, construye torres junto al camino y observa cómo siguen a los enemigos; después, pulsa Check.
Pruébalo tú mismo
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 lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.