Строительные площадки
Урок 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.
Задание
СреднеНа площадках есть скрипт BuildPad, а у объекта Game есть компонент BuildManager, у которого в поле towerPrefab указан префаб ArrowTower.
- В
BuildPad.csдобавь открытое полеtowerтипа Tower: башня, построенная на этой площадке, или null. - В
BuildManagerдобавь сериализованное закрытое полеtowerPrefab(типа Tower). ВUpdate, когда в этом кадре нажата левая кнопка мыши, проведи луч от камеры через указатель мыши. - Когда луч попадает в коллайдер, у которого есть BuildPad, и на этой площадке ещё нет башни, создай экземпляр
towerPrefabв позиции площадки и сохрани новую башню в полеtowerплощадки. Если на площадке уже есть башня или объект не является площадкой, ничего не происходит.
Нажми Play и щёлкни по нескольким площадкам, затем нажми Check.
Попробуйте сами
using UnityEngine;
// Будет добавлено позже: нажатие на площадки строительства для размещения башен, магазин и панель башни.
public class BuildManager : MonoBehaviour
{
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.