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.
Görev
KolayLaser içinde Fire() metodunu yaz: tek ışın, dört sonuç.
- Kuleden
transform.forwardyönünde,rangeuzunluğundaPhysics.Raycastışını gönder. IskalarsaMissedkaydını oluştur. hit.collider.TryGetComponent(out IDamageable target)doğruysaTakeDamage(damage)metodunu çağır ve"Hit " + hit.collider.namekaydını oluştur.- Aksi takdirde, bir
Rigidbodybileşeni varsaAddForce(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
1Kalıtım Değil, Bileşenler
Küçük BileşenlerTemel Düşman Script'iSoyut BileşenlerBirlikte Çalışan BileşenlerTekrar: Modüler TaretTekrar: Çift Namlulu Top4Serileştirilmiş Veriler
Serileştirilebilir SınıflarInspector'da ListelerInspector'da Enum'larTekrar: Ganimet TablosuTekrar: Ganimeti At2Unity'de Arayüzler
IDamageableArayüzler ve TryGetComponentGetComponentsÖzet: Etkileşim TuşuÖzet: Erişim Mesafesindeki En Yakın5ScriptableObjects
Veri VarlıklarıSilah İstatistikleriOrtak AyarlarRüzgârı KaydetVeri Olarak DalgalarTekrar: Eşya VeritabanıTekrar: Dükkândan Satın Al8Yeniden Kullanılabilir Kod
Genişletme MetotlarıGeneric SingletonGeneric YardımcılarTekrar: FindNearestKendi başına pratik yap: Unity playground