Menu
CoddyTech

Arayüzler ve TryGetComponent

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

TryGetComponent, tek bir çağrıda bir bileşen ister ve bileşeni bulup bulmadığını bildirir. Arayüzlerle de çalışır; bu nedenle çarptığınız nesneye hasar verilip verilemeyeceğini sormanın yaygın yoludur. 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. Nesnede IDamageable uygulayan bir bileşen varsa TryGetComponent true döndürür ve target değişkenini doldurur; aksi takdirde false döndürür ve target değeri null olur. Yalnızca o nesneye bakar; üst nesnesine veya alt nesnelerine asla bakmaz.

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

challenge icon

Görev

Kolay

Laser içinde Fire() metodunu yaz: tek ışın, dört sonuç.

  1. Kuleden transform.forward yönünde, range uzunluğunda Physics.Raycast ışını gönder. Iskalarsa Missed kaydını oluştur.
  2. hit.collider.TryGetComponent(out IDamageable target) doğruysa TakeDamage(damage) metodunu çağır ve "Hit " + hit.collider.name kaydını oluştur.
  3. Aksi takdirde, bir Rigidbody bileşeni varsa AddForce(transform.forward * push, ForceMode.Impulse) metodunu çağır ve ardından adı ekleyerek "Pushed " kaydını oluştur; yoksa adı ekleyerek "Blocked by " kaydını oluştur.

“Oyna” düğmesine bas, dön ve her yöne ateş et. Ardından “Kontrol et” düğmesine bas.

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ığı nesneyle ilgilen
    }
}

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

Kendi başına pratik yap: Unity playground