Menu
CoddyTech

Złap wzmocnienie

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

Wzmocnienie wykrywa złapanie samodzielnie: jego collider wyzwalający dotyka collidera paletki, a oba ciała są kinematyczne — to wystarczy, aby zadziałało OnTriggerEnter. Spada też obok piłki, dlatego najpierw sprawdza tag.

Wyliczenie określa rodzaje, a każdy prefab ustawia własny w Inspectorze, więc jeden skrypt obsługuje oba:

public enum Kind { Wide, Multiball }
public Kind kind;

if (kind == Kind.Multiball) Debug.Log("Three balls");

other.GetComponent<Paddle>() znajduje skrypt Paddle na obiekcie, którego dotknęło wzmocnienie. Na razie opcja Wide tylko wyświetla komunikat; w następnej lekcji paletka będzie się powiększać.

challenge icon

Wyzwanie

Trudny

Złap spadający PowerUp paletką.

  1. W PowerUp dodaj public enum Kind { Wide, Multiball } i public Kind kind; (każdy prefab ustawia swój rodzaj).
  2. Dodaj OnTriggerEnter(Collider other): zakończ działanie, jeśli other.CompareTag("Paddle") nie jest prawdą; PowerUp typu Wide wywołuje other.GetComponent<Paddle>().Widen();, a następnie Destroy(gameObject);
  3. W Paddle dodaj public void Widen(), która na razie zapisuje w logu Wide paddle.

Naciśnij „Graj” i złap zielony PowerUp: zniknie, a w konsoli pojawi się komunikat Wide paddle. 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 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);
    }
}

Wszystkie lekcje w sekcji Gra w Unity: Brick Breaker

Poćwicz samodzielnie: Edytor online Unity