Menu
CoddyTech

Berpatroli dan Mengejar

Termasuk bagian Fisika dan Gameplay dalam perjalanan Unity di Coddy. Pelajaran 52 dari 63.

Penjaga yang sedang berpatroli berjalan menyusuri rute hingga melihat pemain, mengejarnya, lalu kembali ke rutenya setelah pemain pergi. Kedua perilaku mengarahkan gerakan dengan cara yang sama, menuju sebuah titik, sehingga satu method dapat menggerakkan penjaga untuk keduanya. Penjaga ini berjalan bolak-balik di antara dua pos dan mengejar pemain dalam chaseRange:

[SerializeField] private Transform pointA;
[SerializeField] private Transform pointB;
[SerializeField] private Transform player;
[SerializeField] private float speed = 2f;
[SerializeField] private float chaseRange = 5f;
private Rigidbody rb;
private Transform goal;

void Start()
{
    rb = GetComponent<Rigidbody>();
    goal = pointA;
}

void FixedUpdate()
{
    if (Flat(player.position - rb.position).magnitude < chaseRange)
    {
        WalkTo(player.position);
        return;
    }
    if (Flat(goal.position - rb.position).magnitude < 0.2f)
    {
        goal = goal == pointA ? pointB : pointA;
    }
    WalkTo(goal.position);
}

void WalkTo(Vector3 target)
{
    Vector3 dir = Flat(target - rb.position).normalized;
    rb.linearVelocity = new Vector3(dir.x * speed, rb.linearVelocity.y, dir.z * speed);
}

Vector3 Flat(Vector3 v)
{
    return new Vector3(v.x, 0f, v.z);
}

Pemeriksaan pengejaran dilakukan lebih dahulu, dan return melewati kode patroli, jadi penjaga akan mengejar kapan pun pemain berada di dekatnya. goal adalah field, jadi penjaga mengingatnya selama pengejaran: setelah pemain pergi, penjaga melanjutkan perjalanan ke pos yang sedang dituju.

Pemeriksaan kedatangan mengukur jarak mendatar di atas tanah. Pos-pos tersebut adalah penanda di lantai, sedangkan pusat penjaga berada 1 unit di atasnya, jadi jarak yang memperhitungkan ketinggian tidak akan pernah kurang dari 1 dan penjaga tidak akan pernah berbalik. Pemeriksaan ini meminta jarak kurang dari 0.2, bukan tepat 0: dengan kecepatan 2 unit per detik, penjaga bergerak sejauh 0.04 unit per langkah dan hampir tidak pernah tepat mencapai pos.

challenge icon

Tantangan

Sedang

Sebuah robot keamanan berpatroli di gudang. Tulis skrip Robot. Inspector memberinya waypoints (empat penanda kuning W0 hingga W3, secara berurutan), player, speed (4), dan chaseRange (4). Skrip Player sudah siap.

  • Field int bernama next, yang dimulai dari 0, adalah indeks waypoint yang sedang dituju robot.
  • Patroli: berjalan menuju waypoints[next]. Setelah robot berada kurang dari 0.2 darinya di permukaan tanah, ubah next ke waypoint berikutnya, lalu kembali ke 0 setelah waypoint terakhir.
  • Mengejar: selama jarak pemain kurang dari chaseRange di permukaan tanah, berjalan menuju pemain.
  • Saat pemain menjauh, lanjutkan menuju waypoints[next], yaitu waypoint yang sedang dituju robot.
  • Gerakkan robot dengan mengatur velocity Rigidbody ke speed di permukaan tanah, sambil mempertahankan velocity y-nya.

Tekan Play, amati satu putaran patroli lalu lintasi jalurnya, kemudian tekan Periksa.

Coba sendiri

using UnityEngine;

public class Robot : MonoBehaviour
{
    [SerializeField] private Transform[] waypoints;
    [SerializeField] private Transform player;
    [SerializeField] private float speed = 4f;
    [SerializeField] private float chaseRange = 4f;
    private Rigidbody rb;

    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }

    void FixedUpdate()
    {
        // kejar player saat dekat, atau ikuti rute patroli
    }
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Fisika dan Gameplay