Menu
CoddyTech

Ngắm bằng thanh đỡ

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

Với một cú nảy hoàn hảo, người chơi không thể ngắm hướng bóng. Các trò chơi Brick Breaker để thanh đỡ bóng quyết định hướng bóng: bóng nảy gần đầu bên trái sẽ bay lên trên và sang trái, còn bóng nảy ở giữa sẽ bay thẳng lên trên.

Chuyển vị trí va chạm thành một số từ -1 ở đầu bên trái đến 1 ở đầu bên phải: lấy độ lệch theo trục x của bóng so với tâm thanh đỡ bóng, rồi chia cho một nửa chiều rộng của thanh. Thanh đỡ bóng rộng 4, có tâm tại x 2, va chạm tại x 3: độ lệch là 1, một nửa chiều rộng là 2, nên kết quả là 0.5 và bóng bay theo hướng (0.5, 1, 0), đã chuẩn hóa. Giới hạn giá trị này, vì bóng có thể chạm góc hơi vượt quá đầu thanh.

OnCollisionEnter chạy sau khi vật lý tính toán xong cú nảy, vì vậy vận tốc đặt ở đó sẽ thay thế vận tốc vừa tính. Tường cũng khiến bóng nảy nhưng vẫn giữ cách nảy thông thường, nên hãy kiểm tra thẻ trước. collision.collider.bounds.size.x là chiều rộng của thanh đỡ bóng trong thế giới.

challenge icon

Thử thách

Dễ

Điều chỉnh hướng bóng bằng thanh đỡ: vị trí bóng chạm vào thanh đỡ quyết định góc bay.

  1. Trong Ball, thêm OnCollisionEnter(Collision collision); thoát hàm nếu đối tượng va chạm không có thẻ Paddle.
  2. Tính float x: lấy tọa độ x của bóng trừ tọa độ x của thanh đỡ, rồi chia cho một nửa collision.collider.bounds.size.x, giới hạn kết quả trong khoảng từ -1 đến 1.
  3. Đặt rb.linearVelocity = new Vector3(x, 1f, 0f).normalized * speed;

Nhấn Chơi và đỡ bóng bằng đầu bên trái của thanh đỡ: bóng sẽ bay sang trái. 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>();
        PhysicsMaterial bouncy = new PhysicsMaterial("Bouncy");
        bouncy.bounciness = 1f;
        bouncy.dynamicFriction = 0f;
        bouncy.staticFriction = 0f;
        bouncy.bounceCombine = PhysicsMaterialCombine.Maximum;
        bouncy.frictionCombine = PhysicsMaterialCombine.Minimum;
        GetComponent<Collider>().material = bouncy;
    }

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

    void FixedUpdate()
    {
        if (!launched) return;
        rb.linearVelocity = rb.linearVelocity.normalized * speed;
    }
}

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

Tự luyện tập: Playground Unity