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.
Tantangan
SedangSeekor serigala berburu di hutan. Tulis skrip Wolf pada Wolf. Inspector memberinya player, speed (3), noticeRange (4), dan giveUpRange (8). Skrip Player sudah siap.
- Field
boolbernamachasingmenunjukkan apakah serigala sedang mengejar. Nilai awalnyafalse. - Pada setiap langkah fisika, ukur jarak ke pemain di sepanjang permukaan tanah (tanpa ketinggian). Jika jaraknya lebih dekat daripada
noticeRange,chasingmenjaditrue. Jika lebih jauh daripadagiveUpRange, nilainya menjadifalse. Di antaranya, nilainya tetap. - Saat mengejar, serigala berlari menuju pemain dengan kecepatan
speedmenggunakan 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
}
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Fisika dan Gameplay
1Rigidbody
Gravitasi dan MassaDorong dengan AddForceMelompat dengan ImpulsFixedUpdate untuk FisikaKecepatanBenda KinematikRingkasan: Landasan Peluncur2Tabrakan
OnCollisionEnterApa yang Kutabrak?Pecah Saat BenturanBerdiri di Atas TanahPantulan dan GesekanBentuk ColliderRangkuman: Dinding yang Bisa Hancur3Pemicu
Collider PemicuOnTriggerEnterItem yang Bisa DiambilZona MematikanMasuk dan KeluarRingkasan: Kunci dan Pintu6Raycast
Physics.RaycastRaycastHitMemeriksa Tanah dengan RayLayer dan LayerMaskGaris PandangOverlapSphere dan SphereCastRangkuman: Tripwire Laser9Musuh
Kejar PemainKejar dalam JangkauanBerpatroli dan MengejarKesehatan dan DamageEfek TerpentalRangkuman: Anjing Penjaga