Unity Eğitim
Dersler
Forum Sınav Merkezi Premium 💎
Ağ Programlama

Unity'de Ağ Nesnelerini Güvenle Yok Etme: NetworkServer.Destroy

Paylaşan: Unity Eğitim 26 October 2025 7 dakika okuma 147 görüntülenme

Unity'de çok oyunculu oyunlar geliştirirken, oyun dünyasındaki nesnelerin yaşam döngüsünü doğru bir şekilde yönetmek kritik öneme sahiptir. Özellikle ağ üzerinde, bir nesnenin yok edilmesi işlemi sadece yerel istemcide değil, tüm bağlı istemcilerde tutarlı bir şekilde gerçekleşmelidir. İşte tam bu noktada Unity'nin UNet veya Mirror gibi ağ çözümlerinde kullanılan NetworkServer.Destroy() metodu devreye girer. Bu makalede, Unity NetworkServer Destroy metodunun ne olduğunu, nasıl kullanıldığını, dikkat edilmesi gereken noktaları ve yaygın hataları derinlemesine inceleyeceğiz.

NetworkServer.Destroy() Nedir ve Neden Önemlidir?

NetworkServer.Destroy(), Unity'de ağ özellikli bir nesneyi (yani üzerinde NetworkIdentity bileşeni bulunan bir GameObject'i) sunucu tarafında yok etmek için kullanılan özel bir metottur. Bu metodun temel amacı, bir nesnenin sunucuda yok edildiğinde, bu bilginin tüm bağlı istemcilere doğru ve senkronize bir şekilde iletilmesini sağlamaktır. Böylece, istemciler de kendi yerel kopyalarını yok ederek oyun durumunun ağ genelinde tutarlı kalmasını garanti eder.

Sadece GameObject.Destroy() metodunu kullanarak bir ağ nesnesini yok etmeye çalışmak, yalnızca sunucunun yerel kopyasını yok edecektir. İstemciler bu durumdan haberdar olmayacak ve nesnenin kendileri için hala var olduğunu düşüneceklerdir. Bu durum, oyun dünyasında tutarsızlıklara, hatalara ve istenmeyen davranışlara yol açabilir. Örneğin, sunucuda yok edilmiş bir düşmanın istemcilerde hala hareket etmeye devam etmesi gibi.

Özetle, NetworkServer.Destroy(), ağ üzerindeki nesnelerin yaşam döngüsünü yönetmek için vazgeçilmez bir araçtır. Bir mermi hedefe çarptığında, bir canavar öldüğünde veya toplanabilir bir eşya alındığında, bu metodun kullanılması gerekmektedir.

Nasıl Çalışır?

NetworkServer.Destroy(GameObject obj) metodu çağrıldığında aşağıdaki adımlar gerçekleşir:

  1. Sunucu, belirtilen GameObject'in bir ağ nesnesi olduğunu (yani üzerinde NetworkIdentity bileşeni olduğunu) kontrol eder.
  2. Sunucu, bu nesnenin kimliğini (netId) kullanarak tüm bağlı istemcilere bir "nesne yok etme" mesajı gönderir.
  3. İstemciler bu mesajı aldıklarında, kendi yerel kopyalarını bulur ve GameObject.Destroy() metodunu çağırarak yok ederler.
  4. Sunucu, kendi yerel kopyasını da yok eder.

Bu süreç, tüm istemcilerin oyun dünyasında aynı anda ve doğru bir şekilde güncellenmesini sağlar.

Kullanım Örnekleri

Aşağıdaki örnekte, bir merminin düşmana çarptığında hem mermiyi hem de düşmanı ağ üzerinden nasıl yok edebileceğinizi görebilirsiniz:

using UnityEngine; 
using UnityEngine.Networking; // UNet için, Mirror için farklı namespace olabilir

public class Bullet : NetworkBehaviour
{
    public float speed = 10f;

    void Update()
    {
        if (!isServer) return; // Sadece sunucuda çalışır

        transform.Translate(Vector3.forward * speed * Time.deltaTime);
    }

    void OnTriggerEnter(Collider other)
    {
        if (!isServer) return; // Sadece sunucuda çalışır

        if (other.CompareTag("Enemy"))
        {
            // Düşmanı yok et
            NetworkServer.Destroy(other.gameObject);

            // Mermiyi yok et
            NetworkServer.Destroy(gameObject);
        }
    }
}

Yukarıdaki kod bloğunda isServer kontrolü çok önemlidir. Çünkü NetworkServer.Destroy() metodu sadece sunucu tarafından çağrılmalıdır. İstemciler bu metodu doğrudan çağıramazlar. Eğer bir istemcinin bir nesneyi yok etmesini tetiklemesi gerekiyorsa, istemci sunucuya bir komut ([Command]) göndermeli ve sunucu bu komutu işleyerek Unity NetworkServer Destroy işlemini gerçekleştirmelidir.

Pratik İpuçları

1. Doğru Yerde ve Zamanda Çağırın

NetworkServer.Destroy() metodunu her zaman sunucu tarafında çağırdığınızdan emin olun. Bu genellikle isServer kontrolü ile yapılır. Bir istemcinin bir nesneyi yok etme isteği varsa, bu isteği sunucuya bir [Command] ile iletmeli ve sunucunun bu isteği işlemesini sağlamalısınız. Yanlış yerde yapılan çağrılar, hatalara veya nesnelerin sadece yerel olarak yok olmasına yol açar.

// İstemciden sunucuya komut gönderme örneği
public class PlayerController : NetworkBehaviour
{
    [Command]
    void CmdDestroyTarget(GameObject targetToDestroy)
    {
        if (!targetToDestroy.GetComponent()) 
        {
            Debug.LogError("Hedef ağ nesnesi değil!");
            return;
        }
        NetworkServer.Destroy(targetToDestroy);
    }

    // Bir buton tıklaması veya başka bir olayla tetiklenebilir
    public void RequestDestroyObject(GameObject obj)
    {
        if (isLocalPlayer)
        {
            CmdDestroyTarget(obj);
        }
    }
}

2. İlişkili Nesneleri Yönetin (Child Objects)

Eğer yok ettiğiniz GameObject'in alt nesneleri varsa ve bu alt nesneler de NetworkIdentity bileşenine sahipse, NetworkServer.Destroy() metodunu çağırdığınızda sadece ana nesne değil, tüm hiyerarşi ağ üzerinden yok edilecektir. Bu, genellikle istediğiniz davranıştır. Ancak, bazen alt nesnelerden bazılarının kalmasını veya farklı bir şekilde yok edilmesini isteyebilirsiniz. Bu durumda, alt nesnelerin NetworkIdentity bileşenlerini dikkatlice yönetmeli veya yok etmeden önce hiyerarşiden ayırmalısınız.

3. Yok Etmeden Önce Temizlik Yapın

Bir ağ nesnesini yok etmeden önce, bağlı olabileceği olay dinleyicilerinden aboneliğini kaldırmak veya kullandığı kaynakları serbest bırakmak iyi bir pratiktir. Bu, hafıza sızıntılarını önler ve oyununuzun performansını artırır. OnDestroy() veya OnDisable() gibi Unity yaşam döngüsü metotlarını kullanarak bu temizlik işlemlerini gerçekleştirebilirsiniz. Unutmayın, bu metotlar hem sunucuda hem de istemcilerde çağrılacaktır, bu yüzden ağ durumu kontrolleri (isServer, isClient) kullanmanız gerekebilir.

Yaygın Hatalar ve Çözümleri

Hata 1: İstemciden NetworkServer.Destroy() Çağırmak

Sorun: Bir istemcinin doğrudan NetworkServer.Destroy(gameObject) çağrısı yapmaya çalışması. Bu, hata verecektir çünkü bu işlem sadece sunucu yetkisiyle gerçekleştirilebilir.

Çözüm: İstemcinin bir nesneyi yok etme isteği varsa, bu isteği sunucuya bir [Command] metodu aracılığıyla iletin. Sunucu, bu komutu işledikten sonra Unity NetworkServer Destroy işlemini güvenle yapacaktır.

Hata 2: Ağ Nesnesi İçin GameObject.Destroy() Kullanmak

Sorun: Üzerinde NetworkIdentity bileşeni olan bir GameObject'i, NetworkServer.Destroy() yerine GameObject.Destroy() ile yok etmeye çalışmak. Bu durumda nesne sadece yerel olarak yok olur ve diğer istemcilerde veya sunucuda varlığını sürdürür, bu da ağ tutarsızlığına yol açar.

Çözüm: Ağda senkronize edilmesi gereken tüm nesneler için her zaman NetworkServer.Destroy() kullanın. Yalnızca ağda senkronize edilmeyen (örneğin, sadece görsel efektler gibi) nesneler için GameObject.Destroy() kullanılabilir.

Hata 3: Henüz Spawlanmamış Nesneyi Yok Etmeye Çalışmak

Sorun: NetworkServer.Spawn() ile ağa eklenmemiş veya henüz başlatılmamış bir nesneyi NetworkServer.Destroy() ile yok etmeye çalışmak. Bu durum genellikle bir hata ile sonuçlanır veya beklenen davranışı sergilemez.

Çözüm: NetworkServer.Destroy() çağrısı yapmadan önce nesnenin ağ üzerinde başarıyla spawn edilmiş olduğundan emin olun. Nesnenin aktif bir NetworkIdentity'ye sahip olduğunu ve sunucu tarafından yönetildiğini kontrol edin.

Performans ve Optimizasyon Notları

NetworkServer.Destroy() metodunu çok sık veya gereksiz yere çağırmaktan kaçınmak önemlidir. Her yok etme işlemi, ağ üzerinden istemcilere bir mesaj gönderilmesini gerektirir. Çok sayıda nesnenin aynı anda veya çok kısa aralıklarla yok edilmesi, ağ trafiğini artırabilir ve performansı olumsuz etkileyebilir. Özellikle hızlı tempolu oyunlarda, mermi veya parçacık efektleri gibi çok sayıda geçici nesne varsa, bunları havuzlama (object pooling) yöntemleriyle yönetmek çok daha verimli olacaktır. Nesneleri yok etmek yerine devre dışı bırakıp yeniden kullanmak, hem CPU maliyetini hem de ağ trafiğini önemli ölçüde azaltır.

Sonuç

Unity'de çok oyunculu oyun geliştirmenin temel taşlarından biri olan NetworkServer.Destroy() metodu, ağ üzerinde nesnelerin yaşam döngüsünü tutarlı ve güvenli bir şekilde yönetmek için vazgeçilmezdir. Bu metodu doğru anlamak ve uygulamak, oyununuzun stabilitesi ve oyuncu deneyimi açısından büyük fark yaratacaktır. Unutmayın, ağ nesneleri için her zaman Unity NetworkServer Destroy kullanın ve bu işlemi sadece sunucu tarafında gerçekleştirin. Bu prensiplere bağlı kalarak, daha sağlam ve hatasız çok oyunculu oyunlar geliştirebilirsiniz.

🧠 Ders Sonu Değerlendirme Testi

Dersi tamamladıktan sonra bilgilerinizi test edin ve ekstra puanlar kazanın.

🔥 +50 XP Ödül
🔒

Sınava Katılmak İçin Giriş Yapın

Bu ders sonu testini çözebilmek, bilginizi test edip **+50 XP** kazanmak ve **Sınav Şampiyonu** rozetinin kilidini açmak için üye girişi yapmalısınız.

Yorumlar (0)

Yorum yazabilmek ve derslere katkıda bulunabilmek için giriş yapmalısınız.

İlk yorumu siz yapın!