Paletka
Lekcja 1 z 16 w kursie Gra w Unity: Zbijanie klocków w Coddy.
W tym kursie tworzysz grę Brick Breaker w 3D: paletkę na dole, piłkę odbijającą się od ścian i ścianę z cegieł do rozbicia. Każda lekcja dodaje jedną funkcję: cegły, życia, poziomy, ekran końca gry oraz ulepszenia, które poszerzają paletkę lub dzielą piłkę. Scena jest gotowa: kamera patrzy na pole gry od przodu, a wszystko porusza się w płaszczyźnie x i y przy z = 0. Skrypty Paddle, Ball, Brick, GameManager i PowerUp to na razie krótkie szkielety.
Paletka ma kinematyczny komponent Rigidbody i jest przesuwana za pomocą MovePosition w FixedUpdate, dzięki czemu fizyka uwzględnia jej ruch, a później można wykorzystać to przy odbiciach piłki. Ciało kinematyczne nigdy nie jest zatrzymywane przez zderzacze, które nie mają komponentu Rigidbody, więc boczne ściany go nie zatrzymają: skrypt pilnuje, żeby paletka pozostawała w granicach. Ograniczenie środka do położenia ściany sprawiłoby, że połowa obiektu znalazłaby się wewnątrz ściany, dlatego granicą jest położenie ściany pomniejszone o połowę rozmiaru obiektu. Oto jak zrobić to dla windy poruszającej się w szybie od y = 0 do y = 12:
float halfHeight = transform.localScale.y / 2f;
Vector3 target = rb.position + Vector3.up * input * liftSpeed * Time.fixedDeltaTime;
target.y = Mathf.Clamp(target.y, 0f + halfHeight, 12f - halfHeight);
rb.MovePosition(target);Tutaj input ma wartość 1, gdy winda jedzie w górę, -1, gdy jedzie w dół, a w pozostałych przypadkach 0. Winda o wysokości 2 jednostek utrzymuje środek między 1 a 11, więc jej końce zatrzymują się dokładnie na 0 i 12. Prymityw typu Cube ma po 1 jednostce z każdej strony, więc localScale.y określa wysokość windy, a odczytywanie tej wartości w każdym kroku sprawia, że ograniczenie pozostaje prawidłowe, jeśli rozmiar zmieni się w trakcie działania gry.
Wyzwanie
ŁatwyNapisz ruch paletki w FixedUpdate() klasy Paddle:
- Utwórz
float input: -1, gdy przytrzymana jest strzałka w lewo lub A, 1, gdy przytrzymana jest strzałka w prawo lub D, a w pozostałych przypadkach 0. - Oblicz położenie docelowe: pozycję Rigidbody przesuniętą w prawo o
input * speed * Time.fixedDeltaTime. - Ogranicz współrzędną x położenia docelowego, tak aby końce paletki zatrzymywały się przy wewnętrznych krawędziach ścian:
-wallXiwallX. Szerokość paletki totransform.localScale.x. - Przesuń ją w to miejsce za pomocą
rb.MovePosition.
Naciśnij Play, przesuń paletkę do obu ścian, 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()
{
// Poruszaj się strzałkami lub klawiszami A i D i pozostawaj między ścianami.
}
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.