GetComponent çağrılarını neden önbelleğe almalısınız?

Cevap

GetComponent<T>(), GameObject üzerindeki bileşen listesinde arama yapar. Tek seferlik maliyeti küçüktür ama Update içinde her kare, yüzlerce nesnede çağrıldığında gereksiz CPU yükü oluşturur. Ayrıca Camera.main (eski sürümlerde) ve Find metotları çok daha pahalıdır.

// KÖTÜ
void Update()
{
    GetComponent<Rigidbody>().AddForce(Vector3.up);
    GameObject.Find("Player").transform.position = Vector3.zero;
}

// İYİ
[SerializeField] Transform player;   // Inspector'dan ata
Rigidbody rb;

void Awake() { rb = GetComponent<Rigidbody>(); }

void Update() { rb.AddForce(Vector3.up); }

Diğer iyi pratikler:

  • Referansları mümkünse [SerializeField] ile Inspector'dan atayın; bu en hızlı ve en okunur yoldur.
  • Var olmayabilecek bileşenler için TryGetComponent(out T comp) kullanın; null kontrolüyle birlikte daha temizdir ve editörde allocation yapmaz.
  • [RequireComponent(typeof(Rigidbody))] ile bağımlılığı garanti altına alın.
  • GameObject.Find ve FindObjectOfType çağrılarını sadece başlatma sırasında, mümkünse hiç kullanmayın.
  1. Unity'de Update, FixedUpdate ve LateUpdate arasındaki fark nedir?KolayUnity & C#Game Dev
  2. Rigidbody, physics layer'lar ve raycast nasıl çalışır? FixedUpdate neden önemlidir?OrtaUnity & C#Game Dev
  3. C# delegate, event ve UnityEvent arasındaki farklar nelerdir?OrtaUnity & C#Game Dev
  4. Unity'de garbage collection neden frame düşüşüne yol açar? Update içinde allocation'dan nasıl kaçınırsınız?ZorUnity & C#Game Dev
  5. C#'ta struct ile class arasındaki fark nedir? Value type ve reference type oyunda neden önemlidir?OrtaUnity & C#Game Dev
  6. Prefab nedir? Prefab variant ve nested prefab ne işe yarar?KolayUnity & C#Game Dev

Bu konuda başka bir soru biliyor musun?

Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.

Soru ekle