Menu
CoddyTech

Широкая ракетка

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

Эффект с ограниченным временем действия — это корутина: изменить значение, подождать, вернуть прежнее. Если поймать второй бонус, пока действует первый, отсчёт времени должен начаться заново, поэтому сохрани корутину, которую возвращает StartCoroutine, и останови её перед запуском новой. Иначе первая корутина завершится раньше времени и отменит действие второй. Ускорение:

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;
}

Скорость устанавливается относительно normalSpeed, сохранённой один раз, а не удваивается относительно текущей скорости: два ускорения подряд сделали бы её в 4 раза выше. Ограничение положения платформы каждый шаг проверяет её ширину, поэтому широкая платформа всё равно останавливается у стен.

challenge icon

Задание

Сложно

Усиление Wide делает платформу шире на 8 секунд.

  1. В Paddle добавь public float wideFactor = 1.6f; и public float wideSeconds = 8f;, а в Awake сохрани обычный масштаб по x.
  2. Widen() останавливает выполняющуюся корутину, если она есть, и запускает новую: масштаб по x становится равен обычному, умноженному на wideFactor, затем ждёт wideSeconds и возвращает обычный масштаб.
  3. Для корутины требуется using System.Collections;.

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

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

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);
    }

    public void Widen()
    {
        Debug.Log("Wide paddle");
    }
}

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

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