Menu
CoddyTech

Celuj

Lekcja 8 z 18 w kursie Gra Unity: Obrona wieżowa 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.

challenge icon

Wyzwanie

Średni
  1. W Tower dodaj dwa serializowane pola: head (Transform) i turnSpeed (float, stopnie na sekundę). Prefab ArrowTower przypisuje swoje dziecko ArrowHead i wartość 270.
  2. Gdy wieża ma cel, obracaj głowicę w jego kierunku, tylko wokół osi pionowej, maksymalnie o turnSpeed stopni na sekundę.
  3. Gdy nie ma celu, pozostaw głowicę bez zmian.

Naciśnij Play, zbuduj wieże obok ścieżki i obserwuj, jak podążają za wrogami, a następnie naciśnij Check.

Spróbuj swoich sił

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 iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Gra Unity: Obrona wieżowa