Menu
CoddyTech

Линия видимости

Часть раздела Физика и игровой процесс путешествия по Unity на Coddy. Урок 37 из 63.

Близость к охраннику — не то же самое, что быть у него на виду: стена между вами закрывает обзор. Чтобы проверить, видит ли он цель, выпусти луч от глаза в направлении цели и проверь, что первым он попал именно в цель. Направление — это позиция цели минус ваша позиция, а луч такой длины достигает цели:

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

Камера наблюдения на столбе записывает I see you, пока CanSee() возвращает true. Если цель находится на открытом месте, первым объектом, в который попадает луч, будет цель. Если цель находится за ящиком, луч сначала попадает в ящик, hit.transform — это трансформ ящика, и результат проверки — false. Сам по себе вызов Physics.Raycast тоже возвращает true для ящика, поэтому попадание сравнивается с целью.

У цели должен быть коллайдер, чтобы луч мог её обнаружить. Направление луча не нужно нормализовать, поскольку его длина задаётся параметром maxDistance. Physics.Linecast(from, to) проверяет обратное: есть ли между двумя точками какой-либо коллайдер. Выражение !Physics.Linecast(eye, target.position, wallMask) означает, что на пути нет стены.

challenge icon

Задание

Средне

Сторожевая башня наблюдает за игроком. Скрипт Sentry находится на башне, а в Inspector ей задаются player и range, равный 8. Цвет башни показывает, что она видит:

  • Пока она видит игрока, окрашивай башню в красный цвет (Color.red), а в противном случае — в зелёный (Color.green).
  • Она видит игрока, только когда игрок находится на расстоянии не более range единиц и между ними ничего не стоит.

Нажми Play и обойди игроком стену с помощью стрелок, затем нажми Check.

Попробуйте сами

using UnityEngine;

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

    void Update()
    {
        // Красный, пока турель видит игрока, иначе зелёный.
    }
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Физика и игровой процесс