Menu
CoddyTech

Menzilde Takip

Coddy'nin Unity Journey'sinin Fizik ve Oynanış bölümünün bir parçası. Ders 53 / 71.

Çoğu düşman, siz yaklaşana kadar sizi rahat bırakır. Her fizik adımında oyuncuya olan mesafeyi ölçün ve yalnızca belirli bir menzil içindeyken kovalayın. Bu slime, sightRange içindeyken kovalar ve bunun 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 onu değiştirene kadar hızını korur. Bu olmadan, sizi gözden kaçıran bir slime sürtünme onu durdurana kadar kaymaya devam eder; buzda ise hiç durmaz. y önce 0 olarak ayarlandığı için toPlayer.magnitude yerdeki mesafeyi verir; böylece slime'ın yanındaki bir sandığın üzerinde duran oyuncu yine de onun yanında sayılır.

Tek bir menzilin zayıf bir noktası vardır. Sınırında duran oyuncu bu menzile girip çıkar ve slime tekrar tekrar hareket etmeye başlayıp durur. Düşmanlar bunu iki menzil kullanarak önler: oyuncuyu kısa menzilin içindeyken fark eder ve yalnızca daha uzun menzilin ötesindeyken vazgeçerler. Bir bool, düşmanın kovalayıp kovalamadığını hatırlar; iki menzil arasında bu durumu değiştiren bir şey olmaz, bu yüzden düşman yaptığı şeye devam eder.

challenge icon

Görev

Orta

Kurdu yakındayken oyuncuyu fark etmesini, uzaktayken ise kovalamayı bırakmasını sağla.

  1. FixedUpdate() içinde oyuncuya olan yatay mesafeyi al: noticeRange değerinden küçükse bool chasing alanını true olarak ayarla; giveUpRange değerinden büyükse false olarak ayarla.
  2. chasing etkin durumdayken rb.linearVelocity değerini y değerini koruyarak oyuncuya doğru speed hızında ayarla.
  3. Aksi durumda rb.linearVelocity = new Vector3(0f, rb.linearVelocity.y, 0f); olarak ayarla.

“Oyna” düğmesine bas, kurda doğru yürü ve koş. Ardından “Kontrol et” düğmesine 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
    }
}

Fizik ve Oynanış bölümündeki tüm dersler

Kendi başına pratik yap: Unity playground