Menu
CoddyTech

Kejar dalam Jangkauan

Termasuk bagian Fisika dan Gameplay dalam perjalanan Unity di Coddy. Pelajaran 53 dari 71.

Sebagian besar musuh membiarkanmu sampai kamu mendekat. Ukur jarak ke pemain pada setiap langkah fisika, lalu kejar hanya jika pemain berada dalam jangkauan. Slime ini mengejar dalam sightRange dan diam di luar jangkauan itu:

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 penting: Rigidbody mempertahankan kecepatannya sampai ada sesuatu yang mengubahnya. Tanpa bagian itu, 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 sepanjang permukaan tanah, jadi pemain yang berdiri di atas peti di sebelah slime tetap dianggap berada di sebelahnya.

Satu jangkauan memiliki kelemahan. Pemain yang berdiri di tepinya bergerak masuk dan keluar dari jangkauan itu, sehingga slime mulai bergerak lalu berhenti berulang kali. Musuh mengatasi hal ini dengan dua jangkauan: mereka menyadari keberadaan pemain dalam jangkauan yang lebih pendek dan baru menyerah setelah pemain berada di luar jangkauan yang lebih jauh. Sebuah bool mengingat apakah musuh sedang mengejar, dan di antara kedua jangkauan itu tidak ada yang mengubahnya, sehingga musuh melanjutkan tindakannya.

challenge icon

Tantangan

Sedang

Buat serigala menyadari keberadaan pemain saat berada dekat dan menyerah saat pemain berada jauh.

  1. Di FixedUpdate(), hitung jarak datar ke pemain: jika kurang dari noticeRange, atur field bool chasing menjadi true; jika lebih dari giveUpRange, atur menjadi false.
  2. Saat chasing, arahkan rb.linearVelocity ke pemain dengan kecepatan speed, sambil mempertahankan nilai y-nya.
  3. Jika tidak, atur rb.linearVelocity = new Vector3(0f, rb.linearVelocity.y, 0f);.

Tekan tombol “Main”, dekati serigala lalu berlari menjauh. Setelah itu, tekan tombol “Periksa”.

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 player, berhenti mengejarnya jika terlalu jauh, lalu kejar atau diam
    }
}

Semua pelajaran di Fisika dan Gameplay

Latihan sendiri: Playground Unity