Collision Layers Kurulumu: Gereksiz Fizik Hesaplamalarını Engelleme

Oyunda her nesne diğer tüm nesnelerle çarpışma kontrolü yapıyorsa, sahne karmaşıklaştıkça performans hızla düşer. Collision layer'ları kullanarak sadece gerekli çarpışmaları hesaplatırsın.

Örneğin, düşman NPC'leri birbirlerine çarpmasın ama oyuncu onlara çarpabilsin. Veya UI elemanları hiçbir fizik nesnesiyle etkileşmemelidir. Layer sistemini doğru kurmak, gereksiz hesaplamayı yüzde 70'e kadar azaltabilir.

Temel Ayarlama

Unity'de Physics Settings'e gir. Collision Matrix'i açarsın. Burada her layer'ın diğer layer'larla çarpışıp çarpışmayacağını tanımlarsın.

Önce layer'ları oluştur:

  • Player
  • Enemy
  • Environment
  • Trigger (tetikleyici alanlar)
  • UI

Pratik Örnek

Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası

Bir oyunda üç nesne var: oyuncu, düşman ve dekoratif ağaç. Oyuncu düşmanla çarpışmalı, ağaçla da; ama düşmanlar kendi aralarında çarpışmasın.

Kod olarak şu şekilde ayarlarsın:

1// Enemy scriptinde
2using UnityEngine;
3
4public class Enemy: MonoBehaviour
5{
6void Start()
7{
8gameObject.layer = LayerMask.NameToLayer("Enemy");
9}
10}
11
12// Player scriptinde
13public class Player: MonoBehaviour
14{
15void Start()
16{
17gameObject.layer = LayerMask.NameToLayer("Player");
18}
19
20void OnTriggerEnter(Collider other)
21{
22if (other.CompareTag("Enemy"))
23{
24Debug.Log("Düşmanla çarpıştı!");
25}
26}
27}

Physics Settings'te Collision Matrix'i ayarla:

  • Player Enemy: (çarpışsın)
  • Player Environment: (çarpışsın)
  • Enemy Enemy: (çarpışmasın)
  • Enemy Environment: (çarpışsın)
  • UI hepsi: (hiçbir şeyle çarpışmasın)

Bu ayarlamadan sonra motor Enemy-Enemy çarpışmalarını hesaplamaz. Sahne büyüdükçe bu tasarruf çok belirgin olur.

bknz: Collision Detection Hatasını Ayıklama: Physics Debugger Kullanımı

Reklam · TEST
AdSense Test ReklamıGönderi altı · Görüntülü
konu hakkında tepkinizi verebilirsiniz

2 yorum

  • kahvaltidansonra

    collision matrixi ayarlamak biraz kafa karıştırıcı başta ama bir kez doğru yaptıktan sonra oyun çok daha akıcı çalışıyor gerçekten

  • adlı kullanıcıya yanıt verdi
    kirmizibisiklet

    aynen abi ilk kez kurdum ben de kafam karıştı biraz ama sonra anlattığın gibi yapınca oyun fpsi çok fark ettim düşmanlar birbirleriyle kontrol etmeyi kapatınca çok rahatladı bir de ben layerları şuraya not ettim diye paylaşayım

    1// Physics2D.IgnoreLayerCollision kullanarak da ayarlayabilirsin
    2Physics2D.IgnoreLayerCollision(LayerMask.NameToLayer("Enemy"), LayerMask.NameToLayer("Enemy"), true);
    3
    4// veya Matrix'te manuel olarak unchecked
    5// Player layer'ı sadece: Enemy, Obstacle, Wall ile çarpışacak
    6// Enemy layer'ı: Player, Obstacle, Wall ile ama Enemy-Enemy değil
    7// UI layer'ı: hiçbir şey ile değil

    benim oyunumda bu sayede düşman sayısını 30dan 50ye çıkardım aynı fpste kalarak hiçbir lag yok şimdi