Devriye Gez ve Takip Et
Coddy'nin Unity Journey'sinin Fizik ve Oynanış bölümünün bir parçası. Ders 54 / 71.
Devriye gezen bir muhafız, oyuncuyu görene kadar bir güzergâhta yürür, oyuncuyu kovalar ve oyuncu ortadan kaybolduğunda güzergâhına geri döner. Her iki davranış da aynı şekilde, bir noktaya doğru yönelir; bu nedenle her iki durumda da yürümek için tek bir yöntem kullanılabilir. Bu nöbetçi, iki mevzi arasında ileri geri yürür ve chaseRange içindeyken oyuncuyu kovalar:
[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);
}Kovalamayı kontrol eden koşul önce gelir ve bu koşuldaki return, devriye kodunu atlar; böylece oyuncu yakındayken kovalamaca öncelik kazanır. goal bir alandır, bu yüzden nöbetçi kovalamaca sırasında hedefini hatırlar: oyuncu ortadan kaybolduğunda, yöneldiği mevziye doğru yürümeye devam eder.
Varış kontrolü, zemine paralel uzaklığı ölçer. Mevziler yerdeki işaretlerdir ve nöbetçinin merkezi bunların 1 birim üzerindedir; bu nedenle yüksekliği de içeren bir uzaklık hiçbir zaman 1'in altına düşmez ve nöbetçi asla geri dönmez. Kontrol tam olarak 0 değil, 0.2'den küçük bir değer arar: nöbetçi saniyede 2 birim hızla adım başına 0.04 birim ilerler ve mevziye neredeyse hiçbir zaman tam olarak ulaşmaz.
Görev
OrtaRobotun kontrol noktalarında devriye gezmesini ve yakınına gelen oyuncuyu kovalammasını sağla.
WalkTo(Vector3 target)metodunu yaz;rb.linearVelocitydeğerini, y hızını koruyarak yerdespeedhızıyla hedefe doğru ayarla.FixedUpdate()içinde, oyuncuchaseRangemesafesinden daha yakındaysaWalkTo(player.position)çağır vereturnet.- Aksi durumda,
waypoints[next]noktasına uzaklık 0.2'den az olduğundanext = (next + 1) % waypoints.Length;olarak ayarla, ardındanwaypoints[next]noktasına yürü.
“Oyna” düğmesine bas ve yolunu kes. Ardından “Kontrol et” düğmesine 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ındaysa onu kovala, değilse devriye rotasında ilerle
}
}
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ılarOnTriggerEnterToplanabilirlerKasalar Gerisini SaklarÖldürme 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 EtMenzilde TakipDevriye Gez ve Takip EtSağlık ve Hasarİsabet Eden MermilerGeri İtmeÖzet: Bekçi KöpeğiKendi başına pratik yap: Unity playground