Menu
CoddyTech

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.

challenge icon

Wyzwanie

Trudny

Inspektor 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ą aimSpeed stopni 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ą chargeRate na sekundę, nie przekraczając maxPower, a puszczenie spacji uderza w kulkę z Impulse o tej mocy, w kierunku celowania. Moc wraca wtedy do 0, a publiczne int strokes zwiększa się o 1 i jest wypisywane w logu jako Stroke 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 jako In 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
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Fizyka i rozgrywka