Menu
CoddyTech

Giữ tốc độ

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

Quả bóng trong Brick Breaker không bao giờ chậm lại. PhysicsMaterial xử lý phần lớn việc này: độ nảy 1 giữ nguyên toàn bộ tốc độ sau mỗi lần nảy, còn ma sát 0 giúp tường không kéo quả bóng chậm lại. Tường không có vật liệu, và theo mặc định, Unity lấy giá trị trung bình của hai collider: giá trị 1 của quả bóng và giá trị 0 của tường khiến quả bóng nảy với tốc độ chỉ bằng một nửa. bounceCombine = Maximum và frictionCombine = Minimum giúp các giá trị riêng của quả bóng được ưu tiên.

Vật lý vẫn chưa hoàn toàn chính xác: một thanh đỡ đang di chuyển sẽ truyền thêm tốc độ cho quả bóng, còn các sai số nhỏ tích lũy qua hàng trăm lần nảy. Vì vậy, ở mỗi bước vật lý, quả bóng giữ nguyên hướng di chuyển và được đặt lại tốc độ:

rb.linearVelocity = rb.linearVelocity.normalized * 7f;

Quả bóng đang giảm tốc xuống còn 2 đơn vị mỗi giây sẽ bay với tốc độ 7 trở lại ở bước tiếp theo.

challenge icon

Thử thách

Dễ

Khiến bóng nảy mãi với cùng một tốc độ.

  1. Trong Awake() của Ball, tạo new PhysicsMaterial("Bouncy") với độ nảy là 1, cả hai hệ số ma sát đều bằng 0, bounceCombine = PhysicsMaterialCombine.Maximum và frictionCombine = PhysicsMaterialCombine.Minimum; đặt vật liệu này vào GetComponent<Collider>().material.
  2. Thêm FixedUpdate(): nếu bóng đã được phóng, hãy chạy rb.linearVelocity = rb.linearVelocity.normalized * speed;

Nhấn Chơi rồi phóng bóng: bóng sẽ nảy khỏi mọi bức tường mà không giảm tốc độ. Sau đó nhấn Kiểm tra.

Tự làm thử

using UnityEngine;
using UnityEngine.InputSystem;

public class Ball : MonoBehaviour
{
    public Transform paddle;
    public float speed = 9f;

    Rigidbody rb;
    bool launched;

    void Awake()
    {
        rb = GetComponent<Rigidbody>();
    }

    void Update()
    {
        if (launched) return;
        transform.position = paddle.position + Vector3.up * 0.5f;
        if (Keyboard.current.spaceKey.wasPressedThisFrame) Launch(new Vector3(0.3f, 1f, 0f));
    }

    public void Launch(Vector3 direction)
    {
        launched = true;
        rb.linearVelocity = direction.normalized * speed;
    }
}

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

Tự luyện tập: Playground Unity