Menzil İçinde Takip
Coddy'nin Unity Journey'sinin Fizik ve Oynanış bölümünün bir parçası. Ders 51 / 63.
Çoğu düşman, yanlarına yaklaşana kadar seni rahat bırakır. Her fizik adımında oyuncuya olan mesafeyi ölç ve yalnızca belirli bir menzilin içindeyken kovala. Bu slime, sightRange içindeyken kovalar ve dışındayken hareketsiz durur:
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);
}
}else önemlidir: Bir Rigidbody, bir şey değiştirene kadar hızını korur. Bu olmazsa seni gözden kaçıran bir slime, sürtünme onu durdurana kadar kaymaya devam eder; buzda ise hiç durmaz. y önceden 0 olarak ayarlandığı için toPlayer.magnitude yerdeki mesafeyi verir; böylece slime'ın yanındaki bir sandığın üzerinde duran oyuncu da hâlâ yanında sayılır.
Tek bir menzilin zayıf bir noktası vardır. Sınırında duran oyuncu menzilin içine girip çıkar ve slime tekrar tekrar hareket etmeye başlayıp durur. Düşmanlar bunu iki menzil kullanarak önler: Oyuncuyu kısa bir menzilin içindeyken fark eder ve yalnızca daha uzun bir menzilin ötesinde kovalamaktan vazgeçer. Bir bool, düşmanın kovalayıp kovalamadığını hatırlar; iki menzilin arasında bu değeri değiştiren hiçbir şey olmaz, bu yüzden düşman yaptığı şeye devam eder.
Görev
OrtaBir kurt ormanda avlanıyor. Wolf üzerine Wolf betiğini yaz. Inspector, ona player, speed (3), noticeRange (4) ve giveUpRange (8) değerlerini verir. Player betiği hazır.
chasingadlı birboolalanı, kurdun kovalamakta olup olmadığını belirtir. Başlangıç değerifalse.- Her fizik adımında, oyuncuya olan mesafeyi yer boyunca (yüksekliği hesaba katmadan) ölç.
noticeRangedeğerinden daha yakınsachasingdeğeritrueolur.giveUpRangedeğerinden daha uzaksafalseolur. İkisinin arasındaysa mevcut değerini korur. - Kovalarken kurt, Rigidbody'siyle oyuncuya doğru
speedhızında koşar ve y hızını korur. Aksi hâlde hareketsiz durur: x ve z hızları 0.
Play'e bas, kurda yaklaş ve ardından ondan kaç, sonra Check'e bas.
Kendin dene
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()
{
// player'ı fark et, peşini bırak ve kovala ya da hareketsiz dur
}
}
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