Menu
CoddyTech

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.

challenge icon

Wyzwanie

Średni

Obracaj głowicę każdej wieży w stronę celu.

  1. W klasie Tower dodaj [SerializeField] private Transform head; i [SerializeField] private float turnSpeed = 270f;.
  2. Gdy wieża ma cel, obracaj head w jego stronę tylko wokół osi y, maksymalnie o turnSpeed * Time.deltaTime stopni, używając Quaternion.RotateTowards.
  3. 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