Menu
CoddyTech

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.

challenge icon

Görev

Orta

Bir 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.

  • chasing adlı bir bool alanı, kurdun kovalamakta olup olmadığını belirtir. Başlangıç değeri false.
  • Her fizik adımında, oyuncuya olan mesafeyi yer boyunca (yüksekliği hesaba katmadan) ölç. noticeRange değerinden daha yakınsa chasing değeri true olur. giveUpRange değerinden daha uzaksa false olur. İkisinin arasındaysa mevcut değerini korur.
  • Kovalarken kurt, Rigidbody'siyle oyuncuya doğru speed hı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
    }
}
quiz iconKendini test et

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