Menu
CoddyTech

Строительные площадки

Урок 5 из 18 курса Игра в Unity: защита башен на Coddy.

Игрок строит башни, нажимая на строительные площадки — серые квадраты рядом с дорожкой. Щелчок происходит на экране, в пикселях, а площадки находятся в 3D-мире, поэтому щелчок превращается в луч. Camera.main.ScreenPointToRay(point) возвращает луч, который начинается у камеры и проходит через указанную точку экрана в сцену, а Physics.Raycast отслеживает его и сообщает о первом коллайдере, в который он попадает: том, который игрок видит под курсором мыши. Инструмент рисования, который раскрашивает блок, по которому вы щелкнули:

void Update()
{
    if (!Mouse.current.leftButton.wasPressedThisFrame)
    {
        return;
    }

    Ray ray = Camera.main.ScreenPointToRay(Mouse.current.position.ReadValue());
    if (Physics.Raycast(ray, out RaycastHit hit) && hit.collider.TryGetComponent(out Paintable block))
    {
        block.Paint(brushColor);
    }
}

Вторая часть && выполняется только тогда, когда луч во что-то попал, поэтому переменная hit получает значение. Затем TryGetComponent проверяет, относится ли объект, в который попал луч, к тем, которые вас интересуют: луч также попадает в землю, дорожку и деревья, у которых нет Paintable, поэтому такие щелчки ничего не делают.

Во всех сценах здесь используется только Input System из Unity 6, поэтому Mouse.current считывает данные мыши. Её положение задаётся в экранных пикселях — именно такой формат ожидает ScreenPointToRay.

challenge icon

Задание

Средне

На площадках есть скрипт BuildPad, а у объекта Game есть компонент BuildManager, у которого в поле towerPrefab указан префаб ArrowTower.

  1. В BuildPad.cs добавь открытое поле tower типа Tower: башня, построенная на этой площадке, или null.
  2. В BuildManager добавь сериализованное закрытое поле towerPrefab (типа Tower). В Update, когда в этом кадре нажата левая кнопка мыши, проведи луч от камеры через указатель мыши.
  3. Когда луч попадает в коллайдер, у которого есть BuildPad, и на этой площадке ещё нет башни, создай экземпляр towerPrefab в позиции площадки и сохрани новую башню в поле tower площадки. Если на площадке уже есть башня или объект не является площадкой, ничего не происходит.

Нажми Play и щёлкни по нескольким площадкам, затем нажми Check.

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

using UnityEngine;

// Будет добавлено позже: нажатие на площадки строительства для размещения башен, магазин и панель башни.
public class BuildManager : MonoBehaviour
{
}
quiz iconПроверьте себя

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

Все уроки раздела Игра в Unity: защита башен