Прицелиться
Урок 8 из 18 курса Игра в Unity: защита башен на Coddy.
Башня поворачивается к своей цели: не вся башня, которая стоит на своей площадке, а её верхняя часть — дочерний объект, на котором находится ствол. Поворот дочернего объекта поворачивает всё, что находится под ним, а родительский объект остаётся на месте.
Враги идут ниже верхних частей башен, поэтому направление от верхней части к врагу немного наклонено вниз, и если верхняя часть будет смотреть строго вдоль него, она наклонится вперёд. Если установить y направления в 0, оно останется горизонтальным, поэтому верхняя часть будет поворачиваться только вокруг вертикальной оси. Например, лампа маяка, следующая за кораблём:
Vector3 toShip = ship.position - lamp.position;
toShip.y = 0f;
lamp.rotation = Quaternion.LookRotation(toShip);Quaternion.LookRotation(direction) — это поворот, направляющий объект в указанную сторону, поэтому лампа сразу поворачивается к кораблю. Верхняя часть башни должна поворачиваться с заданной скоростью: Quaternion.RotateTowards(from, to, maxDegrees) из главы о вращении поворачивает объект не более чем на maxDegrees, а скорость поворота в градусах в секунду, умноженная на Time.deltaTime, задаёт величину поворота за каждый кадр.Задание
Средне- В
Towerдобавь два сериализованных поля:head(Transform) иturnSpeed(float, градусов в секунду). Префаб ArrowTower задаёт дочерний объект ArrowHead и значение 270. - Пока у башни есть цель, поворачивай её головную часть в её сторону только вокруг вертикальной оси, не более чем на
turnSpeedградусов в секунду. - Если цели нет, оставь головную часть в текущем положении.
Нажми Play, построй башни рядом с путём и посмотри, как они следят за врагами, затем нажми Check.
Попробуйте сами
using UnityEngine;
public class Tower : MonoBehaviour
{
public int cost = 50;
public float range = 4f;
private Enemy target;
void Update()
{
target = FindTarget();
}
Enemy FindTarget()
{
Enemy nearest = null;
float nearestDistance = range;
foreach (Enemy enemy in Enemy.All)
{
float distance = Vector3.Distance(transform.position, enemy.transform.position);
if (distance <= nearestDistance)
{
nearest = enemy;
nearestDistance = distance;
}
}
return nearest;
}
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.