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.
Tantangan
SedangBuat serigala menyadari keberadaan pemain saat berada dekat dan menyerah saat pemain berada jauh.
- Di
FixedUpdate(), hitung jarak datar ke pemain: jika kurang darinoticeRange, atur fieldbool chasingmenjaditrue; jika lebih darigiveUpRange, atur menjadifalse. - Saat
chasing, arahkanrb.linearVelocityke pemain dengan kecepatanspeed, sambil mempertahankan nilai y-nya. - 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
1Rigidbody
Gravitasi dan MassaDorong dengan AddForceMelompat dengan ImpulsFixedUpdate untuk FisikaKecepatanBenda KinematikRingkasan: Landasan Peluncur4Coroutine
InvokeInvokeRepeating, CancelInvokeCoroutine PertamamuPerulangan dalam CoroutineMenghentikan CoroutineRangkuman: Hitung Mundur10Proyek: Kabur dari Arena
ArenaPara Pemburu2Tabrakan
OnCollisionEnterApa yang Kutabrak?Pecah Saat BenturanBerdiri di Atas TanahPantulan dan GesekanBentuk ColliderRangkuman: Dinding yang Bisa HancurLatihan sendiri: Playground Unity