Menu
CoddyTech

Görüş Hattı

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

Bir muhafızın yakınında olmak, onun tarafından görülmekle aynı şey değildir: aradaki bir duvar görüşü engeller. Görüş hattını test etmek için gözden hedefe doğru bir ışın gönderin ve ışının çarptığı ilk şeyin hedefin kendisi olduğunu kontrol edin. Yön, hedefin konumundan kendi konumunuz çıkarılarak bulunur ve bu uzunluktaki bir ışın hedefe ulaşır:

public Transform target;

bool CanSee()
{
    Vector3 toTarget = target.position - transform.position;
    if (Physics.Raycast(transform.position, toTarget, out RaycastHit hit, toTarget.magnitude))
    {
        return hit.transform == target;
    }
    return false;
}

Bir sütunun üzerindeki güvenlik kamerası, CanSee() doğru olduğunda I see you mesajını kaydeder. Hedef açık alandayken ışının çarptığı ilk şey hedeftir. Hedef bir sandığın arkasındayken ışın önce sandığa çarpar, hit.transform sandığın değerini alır ve yanıt false olur. Physics.Raycast tek başına sandık için de true döndürür; bu yüzden çarpılan nesne hedefle karşılaştırılır.

Işının hedefi bulabilmesi için hedefin bir collider bileşenine ihtiyacı vardır. Işının normalize edilmiş bir yöne ihtiyacı yoktur; çünkü uzunluğu maxDistance değerinden gelir. Physics.Linecast(from, to) soruyu tersinden sorar: iki nokta arasında herhangi bir collider olup olmadığını kontrol eder. !Physics.Linecast(eye, target.position, wallMask) ifadesi, arada duvar olmadığı anlamına gelir.

challenge icon

Görev

Orta

Nöbetçi oyuncuyu görebildiğinde kırmızı, aksi hâlde yeşil olsun.

  1. bool CanSee() yaz: Vector3 toPlayer = player.position - transform.position; kullanarak, toPlayer.magnitude > range olduğunda false döndür.
  2. Ardından Physics.Raycast(transform.position, toPlayer, out RaycastHit hit, range) ışınını gönder ve hit.transform == player döndür; ıskalama durumunda false döndür.
  3. Update() içinde, CanSee() sonucuna göre kulenin rengini Color.red veya Color.green olarak ayarla.

“Oyna” düğmesine bas ve duvarın arkasına yürü. Ardından “Kontrol et”.

Kendin dene

using UnityEngine;

public class Sentry : MonoBehaviour
{
    public Transform player;
    public float range = 8f;

    void Update()
    {
        // Nöbetçi oyuncuyu görebildiği sürece kırmızı, aksi takdirde yeşil.
    }
}

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

Kendi başına pratik yap: Unity playground