Garis Pandang
Termasuk bagian Fisika dan Gameplay dalam perjalanan Unity di Coddy. Pelajaran 39 dari 71.
Berada dekat dengan penjaga tidak sama dengan terlihat olehnya: dinding di antaranya menghalangi pandangan. Untuk menguji garis pandang, pancarkan sinar dari mata menuju target, lalu periksa apakah benda pertama yang terkena adalah target itu sendiri. Arahnya adalah posisi target dikurangi posisimu, dan sinar sepanjang itu mencapai target:
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;
}Kamera keamanan di atas pilar mencatat I see you saat CanSee() bernilai true. Saat target berada di tempat terbuka, sinar pertama kali mengenai target. Saat target berada di balik peti, sinar pertama kali mengenai peti, hit.transform adalah milik peti, dan hasilnya false. Physics.Raycast sendiri juga menghasilkan true untuk peti, itulah sebabnya objek yang terkena dibandingkan dengan target.
Target memerlukan collider agar sinar dapat menemukannya. Sinar tidak memerlukan arah yang dinormalisasi, karena panjangnya berasal dari maxDistance. Physics.Linecast(from, to) mengajukan pertanyaan sebaliknya, apakah ada collider di antara dua titik: !Physics.Linecast(eye, target.position, wallMask) berarti tidak ada dinding yang menghalangi.
Tantangan
SedangWarnai penjaga menjadi merah saat ia bisa melihat pemain, dan hijau jika tidak.
- Tulis
bool CanSee(): denganVector3 toPlayer = player.position - transform.position;, kembalikanfalsesaattoPlayer.magnitude > range. - Lalu lakukan raycast dengan
Physics.Raycast(transform.position, toPlayer, out RaycastHit hit, range)dan kembalikanhit.transform == player; jika tidak mengenai apa pun, kembalikanfalse. - Di
Update(), atur warna menara menjadiColor.redatauColor.greenberdasarkanCanSee().
Tekan tombol “Main” dan berjalanlah ke balik tembok. Lalu tekan tombol “Periksa”.
Coba sendiri
using UnityEngine;
public class Sentry : MonoBehaviour
{
public Transform player;
public float range = 8f;
void Update()
{
// Merah saat sentry dapat melihat player, hijau jika tidak.
}
}
Semua pelajaran di Fisika dan Gameplay
1Rigidbody
Gravitasi dan MassaDorong dengan AddForceMelompat dengan ImpulsFixedUpdate untuk FisikaKecepatanBenda KinematikRingkasan: Landasan Peluncur4Coroutine
InvokeInvokeRepeating, CancelInvokeCoroutine PertamamuPerulangan dalam CoroutineMenghentikan CoroutineRangkuman: Hitung Mundur10Proyek: Kabur dari Arena
ArenaPara Pemburu2Tabrakan
OnCollisionEnterApa yang Kutabrak?Pecah Saat BenturanBerdiri di Atas TanahPantulan dan GesekanBentuk ColliderRangkuman: Dinding yang Bisa HancurLatihan sendiri: Playground Unity