Menu
CoddyTech

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.

challenge icon

Wyzwanie

Łatwy

Napisz ruch paletki w FixedUpdate() klasy Paddle:

  1. 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.
  2. Oblicz położenie docelowe: pozycję Rigidbody przesuniętą w prawo o input * speed * Time.fixedDeltaTime.
  3. Ogranicz współrzędną x położenia docelowego, tak aby końce paletki zatrzymywały się przy wewnętrznych krawędziach ścian: -wallX i wallX. Szerokość paletki to transform.localScale.x.
  4. 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.
    }
}
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