Menu
CoddyTech

Linia widzenia

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

Bycie blisko strażnika to nie to samo, co bycie przez niego zauważonym: ściana pomiędzy wami zasłania widok. Aby sprawdzić, czy strażnik widzi cel, wystrzel promień z jego oka w kierunku celu i sprawdź, czy pierwszą rzeczą, w którą trafi, jest sam cel. Kierunek to pozycja celu pomniejszona o twoją pozycję, a promień o takiej długości dosięga 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 monitoringu na filarze zapisuje I see you, gdy CanSee() zwraca true. Gdy cel znajduje się 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 wykryć. Kierunek promienia nie musi być znormalizowany, ponieważ jego długość wynika z maxDistance. Physics.Linecast(from, to) sprawdza to samo w odwrotny sposób — czy między dwoma punktami znajduje się jakiś collider: !Physics.Linecast(eye, target.position, wallMask) oznacza, że na drodze nie ma ściany.

challenge icon

Wyzwanie

Średni

Pokoloruj wartownika na czerwono, gdy widzi gracza, a w przeciwnym razie na zielono.

  1. Napisz bool CanSee(): użyj Vector3 toPlayer = player.position - transform.position;, zwróć false, gdy toPlayer.magnitude > range.
  2. Następnie wywołaj rzutowanie Physics.Raycast(transform.position, toPlayer, out RaycastHit hit, range) i zwróć hit.transform == player; jeśli nic nie zostanie trafione, zwróć false.
  3. W Update() ustaw kolor wieży na Color.red lub Color.green w zależności od wyniku CanSee().

Naciśnij „Graj” i przejdź za ścianę. Następnie naciśnij „Sprawdź”.

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.
    }
}

Wszystkie lekcje w sekcji Fizyka i rozgrywka

Poćwicz samodzielnie: Edytor online Unity