Menu
CoddyTech

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.

challenge icon

Görev

Orta

Robotun kontrol noktalarında devriye gezmesini ve yakınına gelen oyuncuyu kovalammasını sağla.

  1. WalkTo(Vector3 target) metodunu yaz; rb.linearVelocity değerini, y hızını koruyarak yerde speed hızıyla hedefe doğru ayarla.
  2. FixedUpdate() içinde, oyuncu chaseRange mesafesinden daha yakındaysa WalkTo(player.position) çağır ve return et.
  3. Aksi durumda, waypoints[next] noktasına uzaklık 0.2'den az olduğunda next = (next + 1) % waypoints.Length; olarak ayarla, ardından waypoints[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

Kendi başına pratik yap: Unity playground