Menu
CoddyTech

Linia widzenia

Część sekcji Fizyka i rozgrywka ścieżki Unity w Coddy. Lekcja 37 z 63.

Bycie blisko strażnika to nie to samo co bycie przez niego widzianym: ściana pomiędzy nimi blokuje widok. Aby sprawdzić, czy strażnik widzi cel, wyślij promień od oka w kierunku celu i sprawdź, czy pierwszą rzeczą, w którą trafi, jest sam cel. Kierunek to pozycja celu minus twoja pozycja, a promień o takiej długości dociera do celu:

public Transform target;

bool CanSee()
{
    Vector3 toTarget = target.position - transform.position;
    if (Physics.Raycast(transform.position, toTarget, out RaycastHit hit, toTarget.magnitude))
    {
        return hit.transform == target;
    }
    return false;
}

Kamera bezpieczeństwa na słupie zapisuje I see you, gdy CanSee() zwraca true. Gdy cel jest na otwartej przestrzeni, promień trafia najpierw w cel. Gdy cel znajduje się za skrzynią, promień trafia najpierw w skrzynię, hit.transform wskazuje skrzynię, a wynikiem jest false. Samo Physics.Raycast również zwraca true dla skrzyni, dlatego trafienie jest porównywane z celem.

Cel musi mieć collider, aby promień mógł go znaleźć. Kierunek promienia nie musi być znormalizowany, ponieważ jego długość wynika z maxDistance. Physics.Linecast(from, to) sprawdza to samo z drugiej strony: czy jakikolwiek collider znajduje się między dwoma punktami: !Physics.Linecast(eye, target.position, wallMask) oznacza, że na drodze nie ma ściany.

challenge icon

Wyzwanie

Średni

Wieża strażnicza obserwuje gracza. Skrypt Sentry znajduje się na wieży, a w Inspektorze przypisz mu player i range o wartości 8. Kolor wieży pokazuje, co widzi:

  • Gdy widzi gracza, pokoloruj wieżę na czerwono (Color.red), a w przeciwnym razie na zielono (Color.green).
  • Widzieć gracza może tylko wtedy, gdy gracz znajduje się w odległości nie większej niż range jednostek i nic nie stoi między nimi.

Naciśnij Play i poruszaj graczem wokół ściany za pomocą strzałek, a następnie naciśnij Check.

Spróbuj swoich sił

using UnityEngine;

public class Sentry : MonoBehaviour
{
    public Transform player;
    public float range = 8f;

    void Update()
    {
        // Czerwony, gdy strażnik widzi gracza, w przeciwnym razie zielony.
    }
}
quiz iconSprawdź się

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

Wszystkie lekcje w sekcji Fizyka i rozgrywka