Menu
CoddyTech

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.

challenge icon

Tantangan

Sedang

Warnai penjaga menjadi merah saat ia bisa melihat pemain, dan hijau jika tidak.

  1. Tulis bool CanSee(): dengan Vector3 toPlayer = player.position - transform.position;, kembalikan false saat toPlayer.magnitude > range.
  2. Lalu lakukan raycast dengan Physics.Raycast(transform.position, toPlayer, out RaycastHit hit, range) dan kembalikan hit.transform == player; jika tidak mengenai apa pun, kembalikan false.
  3. Di Update(), atur warna menara menjadi Color.red atau Color.green berdasarkan CanSee().

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

Latihan sendiri: Playground Unity