Unity Eğitim
Dersler
Forum Sınav Merkezi Premium 💎
C# Dersleri

Unity'de NetworkBehaviour.isServer: Sunucu Tarafı Mantığını Anlamak

Paylaşan: Unity Eğitim 07 October 2025 10 dakika okuma 39 görüntülenme

Unity ile çok oyunculu oyunlar geliştirirken, oyunun tutarlılığını ve güvenliğini sağlamak en kritik unsurlardan biridir. Bu noktada, NetworkBehaviour sınıfının temel özelliklerinden biri olan isServer, sunucu tarafı ve istemci tarafı mantığını ayırmamızı sağlayan hayati bir araçtır. Bu makalede, Unity isServer özelliğinin ne anlama geldiğini, neden bu kadar önemli olduğunu, nasıl kullanılacağını ve geliştiricilerin sıkça yaptığı hataları ele alacağız.

Giriş: NetworkBehaviour.isServer Nedir?

Çok oyunculu oyunlarda, oyunun kurallarının ve durumunun tek bir yetkili kaynak tarafından yönetilmesi esastır. Bu yetkili kaynak genellikle "sunucu" olarak adlandırılır. Sunucu, oyuncuların hareketlerini doğrular, çarpışmaları hesaplar, puanları günceller ve oyun dünyasındaki tüm önemli değişiklikleri senkronize eder. İstemciler ise bu bilgileri sunucudan alarak kullanıcıya görsel olarak sunar ve oyuncu girdilerini sunucuya iletir.

Unity'nin ağ sistemi (Netcode for GameObjects veya eski UNET), bu sunucu-istemci ayrımını yönetmek için NetworkBehaviour sınıfını sunar. Bu sınıfı miras alan her nesne, ağ üzerinde iletişim kurabilir ve isServer, isClient, isLocalPlayer gibi özelliklere erişebilir. Özellikle isServer özelliği, mevcut kod parçasının sunucu üzerinde mi yoksa bir istemci üzerinde mi çalıştığını anlamamızı sağlar. Eğer kod sunucu üzerinde çalışıyorsa isServer değeri true olur; aksi takdirde false'tur.

Temeller: isServer Ne Anlama Geliyor ve Neden Önemli?

NetworkBehaviour.isServer, aslında basit bir boolean (doğru/yanlış) değeridir ancak çok büyük bir anlama sahiptir. Bu özellik true olduğunda, çalışan kodun sunucu tarafında olduğunu ve dolayısıyla oyunun yetkili mantığını gerçekleştirmek için uygun bir yer olduğunu gösterir. Örneğin, bir oyuncunun canını azaltma, envanterine yeni bir eşya ekleme veya bir düşmanı yok etme gibi işlemler genellikle sadece sunucu tarafından yapılmalıdır. İstemcilerin bu tür kritik işlemleri doğrudan yapmasına izin vermek, hilelere ve oyun durumunun kolayca manipüle edilmesine yol açabilir.

Yetkili Sunucu (Authoritative Server) modeli, isServer'ın temelini oluşturur. Bu modelde, sunucu oyunun tek gerçekliğini korur ve istemciler sadece bu gerçekliğin birer yansımasını gösterir. Bir istemci, sunucudan onay almadan oyun durumunu değiştiremez. Bu model, özellikle rekabetçi çok oyunculu oyunlarda hileleri önlemek ve adil bir oyun ortamı sağlamak için kritik öneme sahiptir.

Peki, isServer ne zaman true olur?

  • Bir "Dedicated Server" (Özel Sunucu) çalıştırdığınızda, tüm NetworkBehaviour nesneleri için isServer true olacaktır.
  • Bir "Host" (Barındırıcı) olarak oyunu başlattığınızda (yani hem sunucu hem de istemci aynı anda sizseniz), sizin tarafınızdaki NetworkBehaviour nesneleri için hem isServer hem de isClient true olacaktır. Diğer bağlanan istemciler için ise isServer false, isClient true olacaktır.

Bu ayrım, kodunuzu organize etmenizi, güvenliği artırmanızı ve ağ trafiğini optimize etmenizi sağlar. Sunucuya özgü mantığı sadece sunucuda çalıştırarak, istemcilerin gereksiz yere işlem yapmasını veya ağ trafiği oluşturmasını engellersiniz.

isServer Kullanım Senaryoları ve Kod Örnekleri

isServer genellikle bir if ifadesi içinde kullanılır ve sadece sunucu tarafında çalışması gereken kod bloklarını belirler. İşte bazı yaygın kullanım senaryoları:

1. Oyun Durumu Yönetimi ve Nesne Üretimi (Spawning)

Oyunun başlangıcında düşmanları veya belirli nesneleri üretmek, puanları sıfırlamak veya oyun turunu başlatmak gibi işlemler sadece sunucu tarafından yapılmalıdır. Aynı şekilde, yeni oyuncuların oyuna katılmasıyla onların karakterlerini ağ üzerinde üretmek (spawn etmek) de sunucunun sorumluluğundadır.


using UnityEngine;
using Unity.Netcode; // Netcode for GameObjects kullanıyorsanız

public class OyunYöneticisi : NetworkBehaviour
{
    public GameObject DusmanPrefab;

    public override void OnNetworkSpawn()
    {
        // Sadece sunucu tarafında çalışacak kod
        if (IsServer)
        {
            Debug.Log("Sunucu başlatıldı: Oyun durumunu ayarlıyorum.");
            BaslatSunucuMantik();
        }
        else
        {
            Debug.Log("İstemci bağlandı: Oyun verilerini bekliyorum.");
        }
    }

    private void BaslatSunucuMantik()
    {
        // Örnek: Oyunun başlangıç durumunu ayarla
        // veya düşmanları spawn et
        for (int i = 0; i < 3; i++)
        {
            GameObject dusman = Instantiate(DusmanPrefab, new Vector3(i * 2, 0, 0), Quaternion.identity);
            dusman.GetComponent<NetworkObject>().Spawn(); // Ağ üzerinde üret
        }
    }

    // Bir oyuncunun hasar alması durumunda
    public void OyuncuHasarAl(int miktar)
    {
        if (IsServer) // Sadece sunucu hasarı işler
        {
            // Can değerini azalt, öldü mü kontrol et vb.
            Debug.Log($"Sunucu: Bir oyuncu {miktar} hasar aldı.");
            // İstemcilere can değişikliğini bildirmek için Rpc kullanabilirsiniz.
        }
    }
}

2. Yetki Kontrolü ve Güvenlik

Oyuncuların hile yapmasını engellemek için, kritik kararların ve durum değişikliklerinin sadece sunucu tarafından onaylanması gerekir. Örneğin, bir oyuncu bir yetenek kullandığında, bu yeteneğin gerçekten kullanılıp kullanılamayacağını (mana var mı, cooldown bitti mi vb.) sunucu kontrol etmelidir.


using Unity.Netcode;

public class OyuncuYeteneği : NetworkBehaviour
{
    public int ManaMaliyeti = 10;

    // İstemciden sunucuya gönderilen komut
    [Command]
    public void YetenekKullanCommand()
    {
        if (IsServer) // Command'ler zaten sunucuda çalıştığı için bu kontrol teknik olarak gereksizdir
        {              // ancak kodun amacını vurgulamak için kullanılabilir.
            // Sunucu tarafında manayı kontrol et ve yeteneği kullan
            if (GetComponent<OyuncuStats>().CurrentMana >= ManaMaliyeti)
            {
                GetComponent<OyuncuStats>().CurrentMana -= ManaMaliyeti;
                Debug.Log("Sunucu: Yetenek başarıyla kullanıldı.");
                // İstemcilere yetenek kullanımını bildirmek için Rpc çağır
                YetenekKullanildiClientRpc();
            }
            else
            {
                Debug.Log("Sunucu: Yeterli mana yok.");
            }
        }
    }

    [ClientRpc]
    void YetenekKullanildiClientRpc()
    {
        // İstemcilerde yetenek animasyonunu veya görsel efektleri oynat
        Debug.Log("İstemci: Yetenek görsel efekti oynatılıyor.");
    }
}

Yukarıdaki örnekte, YetenekKullanCommand metodu bir istemciden çağrılır ancak yürütme sadece sunucu üzerinde gerçekleşir. Bu sayede, mana kontrolü gibi kritik işlemler güvenli bir şekilde sunucuda yapılır.

Pratik İpuçları

Unity isServer kullanımı konusunda daha verimli ve hatasız kod yazmanızı sağlayacak bazı ipuçları:

  1. Yetkili Sunucu Mantığını Kapsülleme: Tüm kritik oyun mantığını (oyun durumunu değiştiren, nesneleri üreten veya yok eden kodlar) her zaman if (IsServer) blokları içine alın. Bu, hileleri önlemenin ve oyun durumunun tüm istemcilerde tutarlı kalmasını sağlamanın en temel yoludur. Örneğin, bir düşmanın canını sadece sunucu azaltmalı ve ölümünü senkronize etmelidir.
  2. Host Modunda Dikkatli Olun: Host (Barındırıcı) olarak oynarken, hem IsServer hem de IsClient değerleri true olacaktır. Bu durum, bazen sunucuya özel mantığın istemcideki UI veya yerel oyuncu girdisi ile etkileşime girmesi gereken senaryolarda karmaşıklık yaratabilir. Eğer bir kodun sadece dedicated server'da veya sadece host'un sunucu tarafında çalışmasını istiyorsanız, if (IsServer && !IsClient) (sadece dedicated server) veya if (IsServer && IsClient) (sadece host'un sunucu tarafı) gibi daha spesifik kontroller kullanmayı düşünebilirsiniz.
  3. Hata Ayıklama ve Gözlem: Geliştirme aşamasında, kodunuzun hangi tarafta (sunucu mu, istemci mi) çalıştığını anlamak için Debug.Log ifadelerini bolca kullanın. Örneğin: Debug.Log(IsServer ? "SUNUCU: " : "İSTEMCİ: " + "Bu mesajı gönderdim."); Bu, özellikle karmaşık ağ etkileşimlerinde veya beklenmedik davranışlarda sorunları teşhis etmek için altın değerindedir.

Yaygın Hatalar ve Çözümleri

isServer kullanırken geliştiricilerin sıkça yaptığı bazı hatalar ve bunlara yönelik çözümler:

  1. isServer Kontrolünü Atlamak:
    • Hata: Sunucuya özel olması gereken bir kod bloğunu if (IsServer) içine almayı unutmak. Bu, istemcilerin kendi başlarına oyun durumunu değiştirmesine veya sunucuyla senkronizasyonun bozulmasına neden olabilir. Örneğin, bir merminin çarpışmasını sadece istemcinin hesaplaması ve canı düşürmesi.
    • Çözüm: Oyunun kurallarını ve kritik durum değişikliklerini yöneten her kod bloğunun mutlaka bir if (IsServer) kontrolünden geçtiğinden emin olun. Her zaman "Yetkili Sunucu" prensibini aklınızda tutun.
  2. isLocalPlayer ile Karıştırmak:
    • Hata: isServer'ı, yerel oyuncunun kontrol ettiği istemci tarafı nesnelerini (örneğin, kamera takibi veya UI elementleri) tanımlamak için kullanmak.
    • Çözüm: isServer, sunucu tarafı mantığı için kullanılırken, isLocalPlayer (NetworkBehaviour'ın başka bir özelliği) o istemcideki yerel oyuncuya ait nesne için istemci tarafı mantığı (örneğin, klavye girdisi işleme) için kullanılır. Bunlar farklı amaçlara hizmet eder ve karıştırılmamalıdır.
  3. Host Modunda Yanlış Beklentiler:
    • Hata: Host (Barındırıcı) modunda isServer'ın true, isClient'ın ise false olmasını beklemek.
    • Çözüm: Host, hem sunucu hem de istemci olduğu için her iki özellik de true olacaktır. Bu durumu kod yazarken göz önünde bulundurun. Eğer bir kodun sadece dedicated server'da çalışmasını istiyorsanız if (IsServer && !IsClient), sadece host'un istemci tarafında çalışmasını istiyorsanız if (IsClient && IsLocalPlayer) gibi daha spesifik koşullar kullanmanız gerekebilir.

Performans ve Optimizasyon Notları

NetworkBehaviour.isServer kontrolünün kendisi, modern işlemcilerde ihmal edilebilir bir performans maliyetine sahiptir. Yani, bu boolean değerini sorgulamak performansınızı olumsuz etkilemez. Asıl önemli olan, bu kontrolün içinde çalışan kod bloklarının karmaşıklığı ve verimliliğidir.

  • Gereksiz İşlem Yükünü Azaltma: isServer kullanarak, sadece sunucuda çalışması gereken ağır hesaplamaları veya mantıkları istemcilerde çalıştırmayı engellersiniz. Bu, özellikle düşük güçlü istemci cihazlarda performansı artırır.
  • Ağ Trafiği Optimizasyonu: Sunucuya özel kodların istemcilerde çalışmaması, gereksiz ağ mesajlarının gönderilmesini veya işlenmesini önler. Örneğin, sunucuya özgü bir nesne üretim mantığı sadece sunucuda çalışır ve ağ üzerinden istemcilere sadece üretilen nesnenin bilgisi gönderilir, üretim kodu değil.
  • Bellek Kullanımı: Bazı durumlarda, sunucuya özel veri yapıları veya nesneler sadece isServer bloğu içinde başlatılabilir. Bu, istemcilerin bu gereksiz bellek yükünü taşımasını engeller.

Özetle, Unity isServer kontrolü, kodunuzu doğru yerlerde çalıştırarak genel sistem performansını ve ağ verimliliğini artıran bir mekanizmadır. Optimize edilmiş bir çok oyunculu deneyim için doğru kullanımı elzemdir.

Sonuç

NetworkBehaviour.isServer, Unity ile çok oyunculu oyun geliştirirken yetkili sunucu mantığını uygulamak için temel bir araçtır. Bu özellik sayesinde, oyunun güvenliğini, tutarlılığını ve performansını artırabilirsiniz. Sunucuya özgü kod bloklarını doğru bir şekilde ayırarak, hileleri önler, ağ trafiğini optimize eder ve daha sağlam bir oyun deneyimi sunarsınız. Unutmayın, çok oyunculu oyun geliştirmenin anahtarı, sunucunun oyunun tek gerçekliğini koruduğundan emin olmaktır ve Unity isServer bu konuda en büyük yardımcınızdır.

🧠 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!