Devriye ve Takip
Coddy'nin Unity Journey'sinin Fizik ve Oynanış bölümünün bir parçası. Ders 52 / 63.
Nöbetteki bir muhafız, oyuncuyu görene kadar bir güzergâhta yürür, oyuncunun peşine düşer ve oyuncu ortadan kaybolunca güzergâhına geri döner. Her iki davranış da aynı şekilde, bir noktaya doğru yönelir; bu nedenle tek bir yöntem her ikisi için de yürümeyi sağlayabilir. Bu nöbetçi, iki mevzi arasında gidip gelir ve chaseRange içindeki oyuncunun peşine düşer:
[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);
}Önce peşine düşme kontrolü yapılır ve return, devriye kodunu atlar; böylece oyuncu yakın olduğunda peşine düşme öncelik kazanır. goal bir alandır; bu yüzden nöbetçi, peşine düşme sırasında hedefini hatırlar: oyuncu ortadan kaybolunca yöneldiği mevziye doğru yürümeye devam eder.
Varış kontrolü, zemindeki mesafeyi ölçer. Mevziler yerdeki işaretçilerdir ve nöbetçinin merkezi bunların 1 birim üzerindedir; bu nedenle yüksekliği de hesaba katan bir mesafe hiçbir zaman 1'in altına düşmez ve nöbetçi asla geri dönmezdi. Kontrol tam olarak 0'ı değil, 0,2'den küçüğü arar: saniyede 2 birim hızla nöbetçi her adımda 0,04 birim ilerler ve neredeyse hiçbir zaman tam olarak mevzinin üzerine varmaz.
Görev
OrtaBir güvenlik robotu depoda devriye geziyor. Robot betiğini yaz. Inspector ona waypoints (sırayla W0'dan W3'e kadar dört sarı işaretçi), player, speed (4) ve chaseRange (4) değerlerini verir. Player betiği hazır.
- 0'dan başlayan,
nextadlı birintalanı, robotun yürüdüğü ara noktanın indeksidir. - Devriye:
waypoints[next]konumuna yürü. Robot zeminde bu noktaya 0.2'den daha yakın olduğunda,nextdeğerini bir sonraki ara noktaya ilerlet; son noktadan sonra 0'a dön. - Kovalamaca: Oyuncu zeminde
chaseRangedeğerinden daha yakınken, onun yerine oyuncuya doğru yürü. - Oyuncu uzaklaştığında, robotun yöneldiği ara nokta olan
waypoints[next]konumuna doğru ilerlemeye devam et. - Rigidbody'nin hızını zeminde
speeddeğerine ayarlayarak hareket et ve y hızını koru.
Play'e bas, devriyenin bir turunu izle ve yolunu kes, sonra Check'e bas.
Kendin dene
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()
{
// Oyuncu yakındayken onu kovala, değilse devriye rotasında ilerle
}
}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Fizik ve Oynanış bölümündeki tüm dersler
1Rigidbody
Yerçekimi ve KütleAddForce ile İtmeDürtüyle ZıplamaFizik için FixedUpdateHızKinematik CisimlerTekrar: Fırlatma Rampası2Çarpışmalar
OnCollisionEnterNeye Çarptım?Çarpınca KırılYerde DurmakSekme ve SürtünmeCollider ŞekilleriTekrar: Kırılabilir Duvar3Tetikleyiciler
Tetikleyici ÇarpıştırıcılarOnTriggerEnterToplanabilir NesnelerÖlüm BölgeleriGiriş ve ÇıkışÖzet: Anahtar ve Kapı6Işın Atışları
Physics.RaycastRaycastHitIşınla Zemin KontrolüKatmanlar ve LayerMaskGörüş HattıOverlapSphere ve SphereCastTekrar: Lazerli Alarm Teli9Düşmanlar
Oyuncuyu Takip EtMenzil İçinde TakipDevriye ve TakipCan ve HasarGeri SavurmaTekrar: Bekçi Köpeği