Menu
CoddyTech

Thanh đỡ

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

Trong khóa học này, bạn sẽ xây dựng trò chơi Brick Breaker trong không gian 3D, gồm một thanh đỡ bóng, một quả bóng nảy, một bức tường gạch, mạng, các màn chơi và vật phẩm tăng sức mạnh. Mọi thứ di chuyển trên mặt phẳng x và y tại z 0. Các script Paddle, Ball, Brick, GameManager và PowerUp hiện vẫn là khung chưa có nội dung. Nút Chơi chạy trò chơi; nút Kiểm tra chấm điểm.

Thanh đỡ bóng có Rigidbody động học, được di chuyển bằng rb.MovePosition trong FixedUpdate(), để hệ thống vật lý nhận biết chuyển động của nó. Vật thể động học xuyên qua tường, nên script giới hạn chuyển động của nó. Nếu giới hạn tâm thanh đỡ bóng ở vị trí bức tường, một nửa thanh sẽ nằm bên trong tường: giới hạn là vị trí bức tường trừ đi một nửa chiều rộng. Với các bức tường ở -6 và 6, cùng thanh đỡ bóng rộng 2:

float half = 2f / 2f;
target.x = Mathf.Clamp(target.x, -6f + half, 6f - half);
rb.MovePosition(target);

Tâm luôn nằm trong khoảng từ -5 đến 5, nên hai đầu dừng chính xác ở vị trí các bức tường. Đọc chiều rộng từ transform.localScale.x ở mỗi bước giúp giới hạn luôn chính xác nếu thanh đỡ bóng lớn lên.

challenge icon

Thử thách

Dễ

Di chuyển thanh đỡ giữa hai bức tường.

  1. Trong FixedUpdate() của Paddle, đặt float input thành -1 khi bạn giữ phím mũi tên trái hoặc phím A, thành 1 khi bạn giữ phím mũi tên phải hoặc phím D, còn lại là 0.
  2. Tính Vector3 target = rb.position + Vector3.right * input * speed * Time.fixedDeltaTime;
  3. Với float half = transform.localScale.x / 2f;, giới hạn target.x trong khoảng từ -wallX + half đến wallX - half, rồi gọi rb.MovePosition(target);

Nhấn Chơi rồi trượt thanh đỡ vào cả hai bức tường: thanh đỡ sẽ dừng lại ở mỗi bức tường. 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()
    {
        // Di chuyển bằng các phím mũi tên hoặc A và D, đồng thời ở giữa hai bức tường.
    }
}

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

Tự luyện tập: Playground Unity