Menu
CoddyTech

Devriye ve Takip

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

Nöbetteki bir muhafız, oyuncuyu görene kadar bir güzergâhta yürür, oyuncunun peşine düşer ve oyuncu ortadan kaybolunca güzergâhına geri döner. Her iki davranış da aynı şekilde, bir noktaya doğru yönelir; bu nedenle tek bir yöntem her ikisi için de yürümeyi sağlayabilir. Bu nöbetçi, iki mevzi arasında gidip gelir ve chaseRange içindeki oyuncunun peşine düşer:

[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);
}

Önce peşine düşme kontrolü yapılır ve return, devriye kodunu atlar; böylece oyuncu yakın olduğunda peşine düşme öncelik kazanır. goal bir alandır; bu yüzden nöbetçi, peşine düşme sırasında hedefini hatırlar: oyuncu ortadan kaybolunca yöneldiği mevziye doğru yürümeye devam eder.

Varış kontrolü, zemindeki mesafeyi ölçer. Mevziler yerdeki işaretçilerdir ve nöbetçinin merkezi bunların 1 birim üzerindedir; bu nedenle yüksekliği de hesaba katan bir mesafe hiçbir zaman 1'in altına düşmez ve nöbetçi asla geri dönmezdi. Kontrol tam olarak 0'ı değil, 0,2'den küçüğü arar: saniyede 2 birim hızla nöbetçi her adımda 0,04 birim ilerler ve neredeyse hiçbir zaman tam olarak mevzinin üzerine varmaz.

challenge icon

Görev

Orta

Bir güvenlik robotu depoda devriye geziyor. Robot betiğini yaz. Inspector ona waypoints (sırayla W0'dan W3'e kadar dört sarı işaretçi), player, speed (4) ve chaseRange (4) değerlerini verir. Player betiği hazır.

  • 0'dan başlayan, next adlı bir int alanı, robotun yürüdüğü ara noktanın indeksidir.
  • Devriye: waypoints[next] konumuna yürü. Robot zeminde bu noktaya 0.2'den daha yakın olduğunda, next değerini bir sonraki ara noktaya ilerlet; son noktadan sonra 0'a dön.
  • Kovalamaca: Oyuncu zeminde chaseRange değerinden daha yakınken, onun yerine oyuncuya doğru yürü.
  • Oyuncu uzaklaştığında, robotun yöneldiği ara nokta olan waypoints[next] konumuna doğru ilerlemeye devam et.
  • Rigidbody'nin hızını zeminde speed değerine ayarlayarak hareket et ve y hızını koru.

Play'e bas, devriyenin bir turunu izle ve yolunu kes, sonra Check'e 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ındayken onu kovala, değilse devriye rotasında ilerle
    }
}
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