Menu
CoddyTech

Arayüzler ve TryGetComponent

Coddy'nin Unity Journey'sinin Unity'de Oyun Mimarisi bölümünün bir parçası. Ders 7 / 50.

TryGetComponent tek bir çağrıda bileşeni ister ve bulup bulmadığını bildirir. Arayüzlerle de çalışır; bu da vurduğun şeyin zarar görüp göremeyeceğini sormanın olağan yolu olmasını sağlar. Bu mayın, IDamageable olan çevresindeki her şeye hasar verir:

public class Mine : MonoBehaviour
{
    public float radius = 3f;
    public int damage = 5;

    void OnTriggerEnter(Collider other)
    {
        foreach (Collider c in Physics.OverlapSphere(transform.position, radius))
        {
            if (c.TryGetComponent(out IDamageable target))
            {
                target.TakeDamage(damage);
            }
        }
        Destroy(gameObject);
    }
}

out IDamageable target, değişkeni çağrının içinde tanımlar. TryGetComponent, nesnede IDamageable arayüzünü uygulayan bir bileşen varsa true döndürür ve target değişkenine değer atar; aksi hâlde false döndürür ve target null olur. Yalnızca o nesneye bakar; üst öğesine veya alt öğelerine asla bakmaz.

GetComponent, eksik bir sınıfı ve eksik bir arayüzü farklı şekilde bildirir. Editor'da, Rigidbody olmayan bir nesne üzerinde GetComponent<Rigidbody>() Unity'nin sahte null değerini döndürür: == null true olur, ancak ?. bunu algılamaz ve çağrı MissingComponentException hatası verir. Bir arayüzün sahte null değeri yoktur: GetComponent<IDamageable>() gerçek bir C# null değeri döndürür; dolayısıyla == null ve ?. her ikisi de üzerinde çalışır. TryGetComponent her ikisi için de bu sorunu ortadan kaldırır ve bileşen eksik olduğunda Editor'da bellek ayırmaz.

challenge icon

Görev

Kolay

Lazer kulesi sol ve sağ ok tuşlarıyla döner; Boşluk tuşu Laser.cs içindeki Fire() işlevini çağırır. Fire işlevini yaz. Kuleden ileri yönü boyunca range birim uzunluğunda bir ışın gönder (Inspector bu değeri 10 olarak ayarlar), ardından:

  • Üzerinde IDamageable bulunan bir şeye çarparsa, ona TakeDamage(damage) çağrısını yap ve Hit ile nesnenin adını kaydet; örneğin Hit Robot.
  • Nesnede IDamageable yoksa ama Rigidbody varsa, onu AddForce(transform.forward * push, ForceMode.Impulse) ile it ve Pushed ile adını kaydet.
  • Diğer her durumda Blocked by ile adını kaydet; örneğin Blocked by Pillar. Hiçbir şeye çarpmayan bir ışın Missed kaydı oluşturur.

Her iki arama için de TryGetComponent kullan. IDamageable.cs, Robot.cs ve Balloon.cs hazır. Play'e bas ve her yöne ateş et, ardından Check'e tıkla.

Kendin dene

using UnityEngine;
using UnityEngine.InputSystem;

public class Laser : MonoBehaviour
{
    public float range = 10f;
    public int damage = 1;
    public float push = 5f;
    public float turnSpeed = 90f;

    private InputAction moveAction;

    void Start()
    {
        moveAction = InputSystem.actions.FindAction("Move");
    }

    void Update()
    {
        float turn = moveAction.ReadValue<Vector2>().x;
        transform.Rotate(0f, turn * turnSpeed * Time.deltaTime, 0f);
        if (Keyboard.current.spaceKey.wasPressedThisFrame)
        {
            Fire();
        }
    }

    void Fire()
    {
        // İleriye doğru range birim uzunluğunda bir ışın gönder ve çarptığı şeyle ilgilen
    }
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Unity'de Oyun Mimarisi bölümündeki tüm dersler