Menu
CoddyTech

Поймай бонус

Урок 15 из 19 курса Игра в Unity: арканоид на Coddy.

Бонус сам обнаруживает столкновение: его триггерный коллайдер касается коллайдера платформы, и оба тела кинематические — этого достаточно для OnTriggerEnter. Он также падает мимо мяча, поэтому сначала проверяет тег.

Перечисление задаёт виды бонусов, а каждый префаб настраивается отдельно в Inspector, поэтому один скрипт подходит для обоих:

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

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

other.GetComponent<Paddle>() находит скрипт Paddle на объекте, которого коснулся бонус. Пока что широкий бонус только выводит сообщение; в следующем уроке платформа будет увеличиваться.

challenge icon

Задание

Сложно

Поймай подставкой падающее усиление.

  1. В PowerUp добавь public enum Kind { Wide, Multiball } и public Kind kind; (для каждого префаба задаётся его тип).
  2. Добавь OnTriggerEnter(Collider other): выходи из метода, если other.CompareTag("Paddle") возвращает false; широкое усиление вызывает other.GetComponent<Paddle>().Widen();, затем Destroy(gameObject);
  3. В Paddle добавь public void Widen(), который пока выводит в журнал Wide paddle.

Нажми «Играть» и поймай зелёное усиление: оно исчезнет, а в Console появится Wide paddle. Затем нажми «Проверить».

Попробуйте сами

using UnityEngine;
using UnityEngine.InputSystem;

public class Paddle : MonoBehaviour
{
    public float speed = 14f;
    public float wallX = 8f;   // внутренние поверхности боковых стенок находятся на координатах -wallX и 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);
    }
}

Все уроки раздела Игра в Unity: арканоид

Потренируйтесь самостоятельно: Песочница Unity