Marble Golf
Część sekcji Fizyka i rozgrywka ścieżki Unity w Coddy. Lekcja 62 z 63.
Golf z kulką na małym zielonym polu. Kula zaczyna na tee: celujesz nią za pomocą strzałek, przytrzymujesz Spację, aby zwiększyć moc, i puszczasz, żeby oddać strzał. Toczy się, odbija od band i bloku na środku, zwalnia, a gdy jest już wystarczająco wolna, całkowicie się zatrzymuje. Dopiero wtedy możesz oddać kolejny strzał. Kula, która powoli wtacza się do dołka, wpada do niego; ta, która dotrze tam zbyt szybko, przelatuje prosto nad nim. Im mniej uderzeń, tym lepiej.
Napisz dwa skrypty: Golf dla kuli i Hole dla dołka.
Wyzwanie
TrudnyInspektor przypisuje do Golf element pointer (małą żółtą kulkę), aimSpeed (90), chargeRate (4), maxPower (6) i stopSpeed (0.3). Masa kulki wynosi 0.5.
- Celowanie to kąt wokół osi y, początkowo 0 (prosto przed siebie, +z). Strzałka w prawo obraca go w prawo, a strzałka w lewo — w lewo, z prędkością
aimSpeedstopni na sekundę. W każdej klatce umieść wskaźnik w odległości 1 jednostki od kulki, w kierunku celowania. - Kulka pozostaje w spoczynku, gdy jej prędkość jest mniejsza niż
stopSpeed. W każdym kroku fizyki kulka w spoczynku zostaje całkowicie zatrzymana: prędkość liniowa i kątowa wynoszą zero. - Tylko gdy kulka jest w spoczynku: przytrzymanie spacji zwiększa moc z szybkością
chargeRatena sekundę, nie przekraczającmaxPower, a puszczenie spacji uderza w kulkę z Impulse o tej mocy, w kierunku celowania. Moc wraca wtedy do 0, a publiczneint strokeszwiększa się o 1 i jest wypisywane w logu jakoStroke 1.
Inspektor przypisuje do Hole element sinkSpeed (3).
- Gdy kulka (obiekt ze skryptem
Golf) wpada do dołka z prędkością mniejszą niżsinkSpeed, zapisz liczbę jej uderzeń w logu jakoIn the cup in 2 strokes!i dezaktywuj kulkę. Szybsza kulka przetoczy się nad dołkiem.
Naciśnij Play i wbij kulkę do dołka jak najmniejszą liczbą uderzeń, a następnie naciśnij Check.
Spróbuj swoich sił
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>();
}
// celuj strzałkami, ładuj za pomocą Space, uderz po zwolnieniu, zatrzymaj piłkę, gdy porusza się wolno
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Fizyka i rozgrywka
1Ciało sztywne
Grawitacja i masaPopychanie za pomocą AddForceSkok z impulsemFixedUpdate dla fizykiPrędkośćCiała kinematycznePowtórka: platforma startowa2Kolizje
OnCollisionEnterW co uderzyłem?Rozbijanie przy zderzeniuStanie na podłożuOdbicie i tarcieKształty colliderówPodsumowanie: Zniszczalny mur