Menu
CoddyTech

Tầm nhìn

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 39 trên 71.

Đứng gần lính gác không có nghĩa là bị nó nhìn thấy: bức tường ở giữa sẽ chắn tầm nhìn. Để kiểm tra tầm nhìn, hãy bắn một tia từ mắt về phía mục tiêu, rồi kiểm tra xem thứ đầu tiên tia chạm phải có phải chính là mục tiêu hay không. Hướng của tia là vị trí mục tiêu trừ đi vị trí của bạn, và tia có độ dài như vậy sẽ chạm tới mục tiêu:

public Transform target;

bool CanSee()
{
    Vector3 toTarget = target.position - transform.position;
    if (Physics.Raycast(transform.position, toTarget, out RaycastHit hit, toTarget.magnitude))
    {
        return hit.transform == target;
    }
    return false;
}

Một camera an ninh trên cột sẽ ghi lại I see you khi CanSee() trả về true. Khi mục tiêu ở chỗ trống, thứ đầu tiên tia chạm phải là mục tiêu. Khi mục tiêu ở sau một chiếc thùng, tia chạm vào thùng trước, hit.transform là của chiếc thùng, và kết quả là false. Bản thân Physics.Raycast cũng trả về true với chiếc thùng, vì vậy ta mới so sánh vật bị chạm với mục tiêu.

Mục tiêu cần có collider để tia tìm thấy nó. Tia không cần hướng đã chuẩn hóa, vì độ dài của nó lấy từ maxDistance. Physics.Linecast(from, to) kiểm tra theo chiều ngược lại, xem có collider nào nằm giữa hai điểm hay không: !Physics.Linecast(eye, target.position, wallMask) có nghĩa là không có bức tường nào chắn đường.

challenge icon

Thử thách

Trung bình

Tô lính canh màu đỏ khi nó nhìn thấy người chơi, nếu không thì tô màu xanh lá.

  1. Viết bool CanSee(): với Vector3 toPlayer = player.position - transform.position;, trả về false khi toPlayer.magnitude > range.
  2. Sau đó gọi Physics.Raycast(transform.position, toPlayer, out RaycastHit hit, range) và trả về hit.transform == player; nếu không trúng thì trả về false.
  3. Trong Update(), đặt màu của tháp thành Color.red hoặc Color.green dựa trên kết quả của CanSee().

Nhấn Chơi và đi ra sau bức tường. Sau đó nhấn Kiểm tra.

Tự làm thử

using UnityEngine;

public class Sentry : MonoBehaviour
{
    public Transform player;
    public float range = 8f;

    void Update()
    {
        // Đỏ khi lính gác nhìn thấy người chơi, nếu không thì xanh lá.
    }
}

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

Tự luyện tập: Playground Unity