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.
Wyzwanie
TrudnyWzmocnienie Wide poszerza paletkę na 8 sekund.
- W
Paddledodajpublic float wideFactor = 1.6f;ipublic float wideSeconds = 8f;, a w Awake zachowaj normalną skalę x. - Widen() zatrzymuje uruchomioną korutynę, jeśli jakaś działa, i uruchamia nową: skala x pomnożona przez
wideFactorwzględem normalnej, odczekaniewideSeconds, a następnie powrót do normalnej. - 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
4Wzmocnienia
Spadające przedmiotyPoćwicz samodzielnie: Edytor online Unity