Celuj
Lekcja 10 z 25 w kursie Gra w Unity: Obrona wieży w Coddy.
Wieża obraca się w stronę celu: nie cała wieża, która stoi na swojej podstawie, lecz jej głowica, obiekt podrzędny, do którego przymocowana jest lufa. Obrócenie obiektu podrzędnego obraca wszystko, co znajduje się pod nim, a obiekt nadrzędny pozostawia bez zmian.
Wrogowie poruszają się niżej niż głowice, więc kierunek od głowicy do wroga wskazuje nieco w dół, a głowica skierowana dokładnie wzdłuż niego pochyliłaby się do przodu. Ustawienie wartości y kierunku na 0 utrzymuje go w poziomie, dzięki czemu głowica obraca się tylko wokół osi pionowej. Lampa latarni morskiej, która podąża za statkiem:
Vector3 toShip = ship.position - lamp.position;
toShip.y = 0f;
lamp.rotation = Quaternion.LookRotation(toShip);Quaternion.LookRotation(direction) to rotacja skierowana w tym kierunku, więc lampa natychmiast obraca się w stronę statku. Głowica wieży powinna obracać się z określoną prędkością: Quaternion.RotateTowards(from, to, maxDegrees) z rozdziału o rotacji obraca ją maksymalnie o maxDegrees, a prędkość obrotu w stopniach na sekundę pomnożona przez Time.deltaTime daje wartość obrotu dla każdej klatki.Wyzwanie
ŚredniObracaj głowicę każdej wieży w stronę celu.
- W klasie
Towerdodaj[SerializeField] private Transform head;i[SerializeField] private float turnSpeed = 270f;. - Gdy wieża ma cel, obracaj
headw jego stronę tylko wokół osi y, maksymalnie oturnSpeed * Time.deltaTimestopni, używającQuaternion.RotateTowards. - Strzelaj z lufy:
head.position + head.forward * 0.6f.
Naciśnij „Graj”: głowice będą podążać za przeciwnikami i strzelać z lufy. Następnie naciśnij „Sprawdź”.
Spróbuj swoich sił
using UnityEngine;
public class Tower : MonoBehaviour
{
public float range = 4f;
public int damage = 2;
[SerializeField] private Projectile projectilePrefab;
private Enemy target;
private float nextShot;
void Update()
{
Enemy found = FindTarget();
if (found != null && found != target)
{
Debug.Log("Target: " + found.name);
}
target = found;
if (target == null)
{
return;
}
if (Time.time >= nextShot)
{
Fire();
nextShot = Time.time + 1f;
}
}
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;
}
void Fire()
{
Projectile shot = Instantiate(projectilePrefab, transform.position + Vector3.up, Quaternion.identity);
shot.Launch(target.transform, damage);
}
}
Wszystkie lekcje w sekcji Gra w Unity: Obrona wieży
Poćwicz samodzielnie: Edytor online Unity