Menu
CoddyTech

Мраморный гольф

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

Гольф с шариком на небольшом зелёном поле. Шарик начинает на ти: ты наводишь его стрелками, удерживаешь пробел, чтобы набрать силу, и отпускаешь, чтобы ударить. Он катится, отскакивает от бортиков и блока посередине, замедляется, а когда становится достаточно медленным — полностью останавливается. Только после этого можно ударить снова. Шарик, который медленно подкатывается к лунке, падает в неё; тот, который прибывает слишком быстро, катится прямо мимо неё. Чем меньше ударов, тем лучше.

Напиши два скрипта: Golf для шарика и Hole для лунки.

challenge icon

Задание

Сложно

В Inspector задаются для Golf pointer (маленький жёлтый шарик), aimSpeed (90), chargeRate (4), maxPower (6) и stopSpeed (0.3). Масса шарика — 0.5.

  • Прицеливание — это угол вокруг оси y, изначально равный 0 (прямо вперёд, +z). Стрелка вправо поворачивает его вправо, а стрелка влево — влево со скоростью aimSpeed градусов в секунду. Каждый кадр размещайте указатель на расстоянии 1 единицы от шарика в направлении прицеливания.
  • Шарик находится в покое, пока его скорость меньше stopSpeed. На каждом физическом шаге шарик в покое полностью останавливается: линейная и угловая скорости обнуляются.
  • Только пока шарик находится в покое: удерживание Space накапливает силу со скоростью chargeRate в секунду, но не выше maxPower, а отпускание Space ударяет по шарику импульсом этой силы в направлении прицеливания. Затем сила снова становится равной 0, публичное поле int strokes увеличивается на 1, и это записывается в журнал как Stroke 1.

В Inspector задаётся для Hole значение sinkSpeed (3).

  • Когда шарик (объект со скриптом Golf) входит в лунку со скоростью ниже sinkSpeed, запишите количество ударов в журнал как In the cup in 2 strokes! и деактивируйте шарик. Более быстрый шарик прокатится мимо.

Нажмите Play и загоните шарик в лунку за как можно меньшее количество ударов, затем нажмите Check.

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

using UnityEngine;

public class Golf : MonoBehaviour
{
    public int strokes = 0;
    [SerializeField] private Transform pointer;
    [SerializeField] private float aimSpeed = 90f;
    [SerializeField] private float chargeRate = 4f;
    [SerializeField] private float maxPower = 6f;
    [SerializeField] private float stopSpeed = 0.3f;
    private Rigidbody rb;

    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }

    // Прицеливайтесь стрелками, накапливайте силу удара с помощью Space, бейте при отпускании клавиши, останавливайтесь, когда скорость станет низкой
}
quiz iconПроверьте себя

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

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