Мраморный гольф
Часть раздела Физика и игровой процесс путешествия по Unity на Coddy. Урок 62 из 63.
Гольф с шариком на небольшом зелёном поле. Шарик начинает на ти: ты наводишь его стрелками, удерживаешь пробел, чтобы набрать силу, и отпускаешь, чтобы ударить. Он катится, отскакивает от бортиков и блока посередине, замедляется, а когда становится достаточно медленным — полностью останавливается. Только после этого можно ударить снова. Шарик, который медленно подкатывается к лунке, падает в неё; тот, который прибывает слишком быстро, катится прямо мимо неё. Чем меньше ударов, тем лучше.
Напиши два скрипта: Golf для шарика и Hole для лунки.
Задание
СложноВ 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, бейте при отпускании клавиши, останавливайтесь, когда скорость станет низкой
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Физика и игровой процесс
1Твёрдое тело
Гравитация и массаТолкаем с помощью AddForceПрыжок с импульсомFixedUpdate для физикиСкоростьКинематические телаПовторение: пусковая площадка2Столкновения
OnCollisionEnterВо что я попал?Разрушение при столкновенииСтояние на землеОтскок и трениеФормы коллайдеровПовторение: разрушаемая стена5Проект: Погоня за монетами
Катящийся мячМонеты для сбора