Menu
CoddyTech

Thanh đỡ rộng hơn

Bài học 16 trên 19 trong khóa học Trò chơi Unity: phá gạch của Coddy.

Một hiệu ứng có thời hạn là một coroutine: thay đổi, chờ, rồi đổi lại. Nếu bắt được lần thứ hai khi lần đầu vẫn đang chạy, thời gian phải bắt đầu lại, vì vậy hãy giữ lại Coroutine mà StartCoroutine trả về và dừng nó trước khi bắt đầu một coroutine mới. Nếu không, coroutine đầu tiên sẽ kết thúc sớm và hoàn tác hiệu ứng thứ hai. Tăng tốc:

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

Lệnh này đặt tốc độ dựa trên normalSpeed đã được lưu lại, thay vì nhân đôi tốc độ hiện tại: hai lần tăng tốc liên tiếp sẽ khiến tốc độ nhanh gấp 4 lần. Phần giới hạn vị trí của thanh đỡ đọc chiều rộng của thanh ở mỗi bước, vì vậy thanh đỡ rộng vẫn dừng ở tường.

challenge icon

Thử thách

Khó

Vật phẩm tăng sức mạnh Wide làm thanh đỡ bóng rộng hơn trong 8 giây.

  1. Trong Paddle, thêm public float wideFactor = 1.6f; và public float wideSeconds = 8f;, đồng thời lưu tỷ lệ x bình thường trong Awake.
  2. Widen() dừng coroutine đang chạy nếu có, rồi bắt đầu một coroutine: tỷ lệ x bằng tỷ lệ bình thường nhân với wideFactor, chờ wideSeconds, rồi trở về bình thường.
  3. Coroutine cần có using System.Collections;.

Nhấn Chơi và đón một vật phẩm màu xanh lá: thanh đỡ bóng sẽ rộng ra rồi thu nhỏ lại. Sau đó nhấn Kiểm tra.

Tự làm thử

using UnityEngine;
using UnityEngine.InputSystem;

public class Paddle : MonoBehaviour
{
    public float speed = 14f;
    public float wallX = 8f;   // Mặt trong của hai bức tường bên nằm tại -wallX và 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");
    }
}

Tất cả bài học trong Trò chơi Unity: phá gạch

Tự luyện tập: Playground Unity