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.
Wyzwanie
Trudny- W
PowerUpdodajpublic enum Kind { Wide, Multiball }ipublic Kind kind(każdy prefab ustawia swój rodzaj). DodajOnTriggerEnter: gdy power-up dotknie obiektu oznaczonego tagiemPaddle, power-up typu Wide wywołujeWiden()w skrypciePaddletego obiektu, a każdy rodzaj niszczy power-up. - W
Paddledodajpublic float wideFactor = 1.6fipublic float wideSeconds = 8f, a także zapamiętaj normalną szerokość paletki, czyli jej skalę x, wAwake(). - Napisz
public void Widen(): uruchamia ona coroutine, która ustawia skalę x paletki na wartość równą normalnej szerokości pomnożonej przezwideFactor, czekawideSecondsi 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);
}
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.