Menu
CoddyTech

Kejar dalam Jangkauan

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

Kebanyakan musuh membiarkanmu selama kamu tidak mendekat. Ukur jarak ke pemain pada setiap langkah fisika, lalu kejar hanya jika berada dalam jangkauan. Slime ini mengejar dalam sightRange dan diam di luarnya:

void FixedUpdate()
{
    Vector3 toPlayer = player.position - rb.position;
    toPlayer.y = 0f;
    if (toPlayer.magnitude < sightRange)
    {
        Vector3 dir = toPlayer.normalized;
        rb.linearVelocity = new Vector3(dir.x * speed, rb.linearVelocity.y, dir.z * speed);
    }
    else
    {
        rb.linearVelocity = new Vector3(0f, rb.linearVelocity.y, 0f);
    }
}

Bagian else itu penting: Rigidbody mempertahankan kecepatannya sampai ada sesuatu yang mengubahnya. Tanpanya, slime yang kehilangan jejakmu akan terus meluncur sampai gesekan menghentikannya, dan di atas es slime itu tidak akan pernah berhenti. Karena y diatur ke 0 terlebih dahulu, toPlayer.magnitude adalah jarak di permukaan tanah, jadi pemain yang berdiri di atas peti di dekat slime tetap dianggap berada di dekatnya.

Satu jangkauan memiliki titik lemah. Pemain yang berdiri tepat di tepinya akan bergerak masuk dan keluar dari jangkauan itu, sehingga slime mulai bergerak dan berhenti berulang kali. Musuh menghindari hal ini dengan dua jangkauan: mereka menyadari pemain saat berada dalam jangkauan pendek dan baru menyerah saat pemain berada di luar jangkauan yang lebih panjang. bool mengingat apakah musuh sedang mengejar, dan di antara kedua jangkauan itu tidak ada yang mengubahnya, sehingga musuh melanjutkan apa pun yang sedang dilakukannya.

challenge icon

Tantangan

Sedang

Seekor serigala berburu di hutan. Tulis skrip Wolf pada Wolf. Inspector memberinya player, speed (3), noticeRange (4), dan giveUpRange (8). Skrip Player sudah siap.

  • Field bool bernama chasing menunjukkan apakah serigala sedang mengejar. Nilai awalnya false.
  • Pada setiap langkah fisika, ukur jarak ke pemain di sepanjang permukaan tanah (tanpa ketinggian). Jika jaraknya lebih dekat daripada noticeRange, chasing menjadi true. Jika lebih jauh daripada giveUpRange, nilainya menjadi false. Di antaranya, nilainya tetap.
  • Saat mengejar, serigala berlari menuju pemain dengan kecepatan speed menggunakan Rigidbody-nya, sambil mempertahankan kecepatan y. Jika tidak, serigala diam, dengan kecepatan x dan z sebesar 0.

Tekan Play, dekati serigala lalu larilah menjauh, kemudian tekan Check.

Coba sendiri

using UnityEngine;

public class Wolf : MonoBehaviour
{
    [SerializeField] private Transform player;
    [SerializeField] private float speed = 3f;
    [SerializeField] private float noticeRange = 4f;
    [SerializeField] private float giveUpRange = 8f;
    private Rigidbody rb;

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

    void FixedUpdate()
    {
        // deteksi pemain, berhenti mengejarnya jika terlalu jauh, lalu kejar atau diam di tempat
    }
}
quiz iconUji dirimu

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

Semua pelajaran di Fisika dan Gameplay