Пушка и мишень
Часть раздела Физика и игровой процесс путешествия по Unity на Coddy. Урок 61 из 63.
На одном конце стрельбища стоит пушка, а три мишени скользят из стороны в сторону на разных расстояниях. Наклоняй ствол вверх и вниз, чтобы достать до каждой мишени, и рассчитывай момент выстрела так, чтобы он совпал с пересечением мишенью линии огня. Шар, попавший в мишень, выбивает её и расходуется; всё остальное, что задевает мишень, оставляет её нетронутой. Мишени — кинематические тела, поэтому попадания никогда их не толкают, а в пушке пять шаров.
Напиши два скрипта: Cannon для ствола и Target для каждой мишени.
Задание
СложноВ Inspector для Cannon заданы ballPrefab (объект Rigidbody: префаб Ball, масса 2, тег Ball), angle (30), turnSpeed (40), power (30) и balls (5).
- Стрелка вверх увеличивает
angle, а стрелка вниз уменьшает его со скоростьюturnSpeedградусов в секунду, не позволяя значению стать меньше 10 или больше 60. Каждый кадр задавай стволу поворотQuaternion.Euler(-angle, 0, 0): в Unity положительный угол по оси x наклоняет переднюю часть вниз, поэтому знак минус наклоняет её вверх. - Пробел выстреливает шаром, пока значение
ballsбольше 0: создай его на расстоянии 1 единицы перед центром ствола, вдоль ствола, толкни его импульсомpowerвдоль ствола, уменьшиballsна 1 и выведи в лог оставшееся количество, напримерBalls left: 4. Если шаров не осталось, нажатие пробела ничего не делает.
У каждой цели есть кинематический Rigidbody, а в Inspector для Target заданы speed и range (2 и 3 для Target1).
- На каждом физическом шаге перемещай цель вдоль оси x с помощью
MovePositionсо скоростьюspeedединиц в секунду и разворачивай её, когда она удаляется наrangeединиц от начального положения. - Когда шар (с тегом
Ball) попадает в цель, выведи в лог имя цели иhit!, напримерTarget2 hit!, а затем уничтожь и цель, и шар. Всё, что не является шаром, оставляет цель нетронутой.
Нажми Play и сбей все три цели, затем нажми Check.
Попробуйте сами
using UnityEngine;
public class Cannon : MonoBehaviour
{
[SerializeField] private Rigidbody ballPrefab;
[SerializeField] private float angle = 30f;
[SerializeField] private float turnSpeed = 40f;
[SerializeField] private float power = 30f;
[SerializeField] private int balls = 5;
void Update()
{
// Цельтесь стрелками вверх и вниз, стреляйте клавишей Space
}
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Физика и игровой процесс
1Твёрдое тело
Гравитация и массаТолкаем с помощью AddForceПрыжок с импульсомFixedUpdate для физикиСкоростьКинематические телаПовторение: пусковая площадка2Столкновения
OnCollisionEnterВо что я попал?Разрушение при столкновенииСтояние на землеОтскок и трениеФормы коллайдеровПовторение: разрушаемая стена5Проект: Погоня за монетами
Катящийся мячМонеты для сбора