Menu
CoddyTech

Görüş Hattı

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

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 ç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() true olduğu sürece I see you kaydını tutar. Hedef açıkta olduğunda, ışının ilk çarptığı şey hedeftir. Hedef bir sandığın arkasındaysa, ışın önce sandığa çarpar, hit.transform sandığın transform'u olur ve sonuç 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 hedefte bir collider bulunmalıdır. Uzunluğu maxDistance değerinden geldiğinden, ışının yönünün normalize edilmesi gerekmez. Physics.Linecast(from, to) soruyu ters yönden sorar: iki nokta arasında herhangi bir collider olup olmadığını kontrol eder. !Physics.Linecast(eye, target.position, wallMask), arada duvar olmadığı anlamına gelir.

challenge icon

Görev

Orta

Nöbetçi kulesi oyuncuyu gözetler. Sentry betiği kuleye eklenir ve Inspector, ona player değerini ve 8 birimlik bir range değeri verir. Kulenin rengi ne gördüğünü gösterir:

  • Oyuncuyu görebildiği sürece kuleyi kırmızıya (Color.red) boya; aksi hâlde yeşile boya (Color.green).
  • Oyuncuyu yalnızca oyuncu en fazla range birim uzaktaysa ve arada hiçbir şey yoksa görür.

Play'e bas ve ok tuşlarıyla oyuncuyu duvarın etrafında gezdir, ardından Check'e bas.

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 halde yeşil.
    }
}
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