Menu
CoddyTech

Szeroka paletka

Lekcja 16 z 19 w kursie Gra w Unity: Brick Breaker w Coddy.

Efekt czasowy to korutyna: zmiana, oczekiwanie, przywrócenie poprzedniej wartości. Jeśli podczas działania pierwszej korutyny złapiesz kolejny obiekt, czas musi zacząć biec od nowa, więc zachowaj obiekt Coroutine zwrócony przez StartCoroutine i zatrzymaj go przed uruchomieniem nowej korutyny. W przeciwnym razie pierwsza korutyna zakończy się przed czasem i cofnie zmianę wprowadzoną przez drugą. Przyspieszenie:

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;
}

Prędkość jest ustawiana na podstawie normalSpeed, zachowanej w jednym miejscu, zamiast podwajania aktualnej prędkości: dwa przyspieszenia z rzędu sprawiłyby, że prędkość byłaby 4 razy większa. Ograniczenie położenia paletki odczytuje jej szerokość na każdym kroku, więc nawet szeroka paletka nadal zatrzymuje się przy ścianach.

challenge icon

Wyzwanie

Trudny

Wzmocnienie Wide poszerza paletkę na 8 sekund.

  1. W Paddle dodaj public float wideFactor = 1.6f; i public float wideSeconds = 8f;, a w Awake zachowaj normalną skalę x.
  2. Widen() zatrzymuje uruchomioną korutynę, jeśli jakaś działa, i uruchamia nową: skala x pomnożona przez wideFactor względem normalnej, odczekanie wideSeconds, a następnie powrót do normalnej.
  3. Korutyna wymaga using System.Collections;.

Naciśnij „Graj” i złap zielone wzmocnienie: paletka się powiększy, a potem znów się zmniejszy. Następnie naciśnij „Sprawdź”.

Spróbuj swoich sił

using UnityEngine;
using UnityEngine.InputSystem;

public class Paddle : MonoBehaviour
{
    public float speed = 14f;
    public float wallX = 8f;   // wewnętrzne powierzchnie ścian bocznych znajdują się przy -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);
    }

    public void Widen()
    {
        Debug.Log("Wide paddle");
    }
}

Wszystkie lekcje w sekcji Gra w Unity: Brick Breaker

Poćwicz samodzielnie: Edytor online Unity