Menu
CoddyTech

Пушка и мишень

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

На одном конце стрельбища стоит пушка, а три мишени скользят из стороны в сторону на разных расстояниях. Наклоняй ствол вверх и вниз, чтобы достать до каждой мишени, и рассчитывай момент выстрела так, чтобы он совпал с пересечением мишенью линии огня. Шар, попавший в мишень, выбивает её и расходуется; всё остальное, что задевает мишень, оставляет её нетронутой. Мишени — кинематические тела, поэтому попадания никогда их не толкают, а в пушке пять шаров.

Напиши два скрипта: Cannon для ствола и Target для каждой мишени.

challenge icon

Задание

Сложно

В 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
    }
}
quiz iconПроверьте себя

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

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