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.FindveFindObjectOfTypeçağrılarını sadece başlatma sırasında, mümkünse hiç kullanmayın.
İlgili Unity & C# soruları
- Unity'de Update, FixedUpdate ve LateUpdate arasındaki fark nedir?
- Rigidbody, physics layer'lar ve raycast nasıl çalışır? FixedUpdate neden önemlidir?
- C# delegate, event ve UnityEvent arasındaki farklar nelerdir?
- Unity'de garbage collection neden frame düşüşüne yol açar? Update içinde allocation'dan nasıl kaçınırsınız?
- C#'ta struct ile class arasındaki fark nedir? Value type ve reference type oyunda neden önemlidir?
- Prefab nedir? Prefab variant ve nested prefab ne işe yarar?
Bu konuda başka bir soru biliyor musun?
Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.