Menu
CoddyTech

OverlapSphere và SphereCast

Thuộc phần Vật lý và lối chơi trong hành trình Unity của Coddy. Bài học 40 trên 71.

Ray hỏi về một đường thẳng. Physics.OverlapSphere(center, radius) hỏi về một vùng hình cầu: nó trả về một mảng chứa mọi collider chạm vào hình cầu tại center, không có hướng hay khoảng cách. Quả bom này phá hủy mọi thùng hàng trong phạm vi 3 đơn vị khi phát nổ:

void Explode()
{
    Collider[] hits = Physics.OverlapSphere(transform.position, 3f);
    foreach (Collider c in hits)
    {
        if (c.CompareTag("Crate"))
        {
            Destroy(c.gameObject);
        }
    }
    Destroy(gameObject);
}

Mảng chứa mọi thứ trong phạm vi: sàn nhà, tường và collider của chính quả bom, vì phép kiểm tra chồng lấn không bỏ qua collider mà chúng bắt đầu ở bên trong. Vì vậy, vòng lặp kiểm tra tag trước khi hành động. attachedRigidbody của mỗi collider là Rigidbody mà nó thuộc về, hoặc là null đối với những vật thể tĩnh như sàn nhà.

Physics.SphereCast(origin, radius, direction, out hit, maxDistance) là một ray dày: nó quét một hình cầu dọc theo đường thẳng và báo về collider đầu tiên mà hình cầu sẽ va phải. Một tảng đá có bán kính 1 lăn về phía khe hở rộng 1.5 giữa hai cọc sẽ dùng nó để kiểm tra xem tảng đá có lọt qua không: một ray mảnh đi qua giữa khe hở không va phải vật gì, còn phép sphere cast va phải một chiếc cọc. Giống như ray, sphere cast bỏ qua các collider mà nó đã chạm vào tại điểm bắt đầu.

challenge icon

Thử thách

Trung bình

Cho khẩu pháo một luồng bắn rộng bằng Physics.SphereCast.

  1. Khi nhấn Space, quét một hình cầu: Physics.SphereCast(transform.position, radius, transform.forward, out RaycastHit hit, range).
  2. Khi bắn trúng, ghi nhật ký "Hit " + hit.collider.name (phát bắn đầu tiên ghi Hit Pole) rồi hủy đối tượng đó.
  3. Khi bắn trượt, ghi nhật ký Miss.

Nhấn Chơi và bắn ba lần: Pole biến mất, rồi đến Crate, sau đó là Miss. Tiếp theo, nhấn Kiểm tra.

Tự làm thử

using UnityEngine;

public class Beam : MonoBehaviour
{
    public float radius = 0.5f;
    public float range = 12f;

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            // Quét một hình cầu có bán kính radius về phía trước: phá hủy vật đầu tiên mà nó chạm phải.
        }
    }
}

Tất cả bài học trong Vật lý và lối chơi

Tự luyện tập: Playground Unity