Menu
CoddyTech

Szeroka paletka

Lekcja 14 z 16 w kursie Gra w Unity: Zbijanie klocków w Coddy.

Ulepszenie Wide złapane paletką poszerza ją na kilka sekund. Ulepszenie wykrywa złapanie: jego collider wyzwalający dotyka collidera paletki, a oba ciała są kinematyczne, co wystarcza do wywołania OnTriggerEnter. Podczas opadania przenika też przez piłkę, więc sprawdza tag. Enum z rodzajami, ustawiany dla każdego prefabrykatu w Inspectorze, odróżnia jedno ulepszenie od drugiego.

Efekt czasowy to coroutine: zmień, poczekaj, zmień z powrotem. Drugie złapanie, gdy pierwsza coroutine nadal działa, musi rozpocząć odmierzanie czasu od nowa, więc zachowaj Coroutine, które zwraca StartCoroutine, i zatrzymaj ją przed uruchomieniem nowej. W przeciwnym razie pierwsza zakończy się za wcześnie i cofnie efekt drugiej. Przyspieszenie:

Coroutine boost;

public void Boost()
{
    if (boost != null) StopCoroutine(boost);
    boost = StartCoroutine(BoostFor(3f));
}

IEnumerator BoostFor(float seconds)
{
    speed = normalSpeed * 2f;
    yield return new WaitForSeconds(seconds);
    speed = normalSpeed;
    boost = null;
}

Przyspieszenie ustawia prędkość na podstawie normalSpeed, zapamiętanej raz, zamiast podwajać bieżącą prędkość, a później dzielić ją przez dwa: dwa przyspieszenia z rzędu zwiększyłyby prędkość 4 razy. Ograniczenie paletki już odczytuje jej szerokość przy każdym kroku, więc szeroka paletka nadal zatrzymuje się przy ścianach.

challenge icon

Wyzwanie

Trudny
  1. W PowerUp dodaj public enum Kind { Wide, Multiball } i public Kind kind (każdy prefab ustawia swój rodzaj). Dodaj OnTriggerEnter: gdy power-up dotknie obiektu oznaczonego tagiem Paddle, power-up typu Wide wywołuje Widen() w skrypcie Paddle tego obiektu, a każdy rodzaj niszczy power-up.
  2. W Paddle dodaj public float wideFactor = 1.6f i public float wideSeconds = 8f, a także zapamiętaj normalną szerokość paletki, czyli jej skalę x, w Awake().
  3. Napisz public void Widen(): uruchamia ona coroutine, która ustawia skalę x paletki na wartość równą normalnej szerokości pomnożonej przez wideFactor, czeka wideSeconds i przywraca normalną szerokość. Zebranie kolejnego power-upu podczas poszerzenia rozpoczyna odliczanie od nowa.

Power-up Multiball zostaje zebrany, ale na razie nic nie robi.

Naciśnij Play, zbierz zielony power-up, a następnie naciśnij Check.

Spróbuj swoich sił

using UnityEngine;
using UnityEngine.InputSystem;

public class Paddle : MonoBehaviour
{
    public float speed = 14f;
    public float wallX = 8f;   // wewnętrzne powierzchnie bocznych ścian znajdują się na pozycjach -wallX i wallX

    Rigidbody rb;

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

    void FixedUpdate()
    {
        float input = 0f;
        if (Keyboard.current.leftArrowKey.isPressed || Keyboard.current.aKey.isPressed) input -= 1f;
        if (Keyboard.current.rightArrowKey.isPressed || Keyboard.current.dKey.isPressed) input += 1f;

        Vector3 target = rb.position + Vector3.right * input * speed * Time.fixedDeltaTime;
        float halfWidth = transform.localScale.x / 2f;
        target.x = Mathf.Clamp(target.x, -wallX + halfWidth, wallX - halfWidth);
        rb.MovePosition(target);
    }
}
quiz iconSprawdź się

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

Wszystkie lekcje w sekcji Gra w Unity: Zbijanie klocków