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.
Thử thách
Trung bìnhTô 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á.
- Viết
bool CanSee(): vớiVector3 toPlayer = player.position - transform.position;, trả vềfalsekhitoPlayer.magnitude > range. - 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. - Trong
Update(), đặt màu của tháp thànhColor.redhoặcColor.greendựa trên kết quả củaCanSee().
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
1Rigidbody
Trọng lực và khối lượngĐẩy bằng AddForceNhảy bằng xung lựcFixedUpdate cho vật lýVận tốcVật thể động họcÔn tập: Bệ phóng4Coroutine
InvokeInvokeRepeating, CancelInvokeCoroutine đầu tiên của bạnVòng lặp trong CoroutineDừng CoroutineÔn tập: đếm ngược10Dự án: Thoát khỏi đấu trường
Đấu trườngThợ săn2Va chạm
OnCollisionEnterMình đã va chạm với gì?Vỡ khi va chạmĐứng trên mặt đấtĐộ nảy và ma sátHình dạng colliderÔn tập: Tường có thể phá vỡ5Dự án: Cuộc đua thu thập xu
Quả bóng lănThu thập xuTự luyện tập: Playground Unity