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

Unity'de OnStartServer() Kullanımı: Ağ Sunucusu Başlatma Stratejileri

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

Unity ağ programlama, çok oyunculu oyunlar geliştirmek için kritik bir alandır. Bu süreçte, sunucunun doğru şekilde başlatılması ve gerekli hazırlıkların yapılması büyük önem taşır. Unity'nin popüler ağ çözümlerinden Mirror'ı kullanırken karşımıza çıkan önemli metotlardan biri de OnStartServer()'dır. Bu makalede, OnStartServer() metodunun ne işe yaradığını, ne zaman ve nasıl kullanılması gerektiğini, yaygın hataları ve pratik ipuçlarını detaylıca inceleyeceğiz.

OnStartServer() Nedir ve Ne Zaman Kullanılır?

OnStartServer(), Mirror ağ kütüphanesinde NetworkBehaviour sınıfından türetilmiş script'lerinizde geçersiz kılabileceğiniz (override edebileceğiniz) bir geri çağırım (callback) metodudur. Adından da anlaşılacağı gibi, bu metot yalnızca sunucu başlatıldığında ve istemciler bağlanmaya başlamadan önce bir kez çağrılır. Herhangi bir istemci (client) tarafından değil, sadece sunucu tarafında çalışır.

Bu metot, oyun dünyasının sunucu tarafındaki ilk kurulumu için ideal bir yerdir. Örneğin, oyunun genel durumunu başlatan, veritabanı bağlantılarını kuran veya sunucuya özel nesneleri oluşturan kodlar genellikle burada yer alır. Unity ağ programlama yaparken, sunucu ve istemci arasındaki ayrımı iyi anlamak, OnStartServer() gibi metotları doğru kullanmanın anahtarıdır.

Neden OnStartServer() Kullanmalıyız? (Start() ile Farkı)

Yeni başlayanların en sık yaptığı hatalardan biri, sunucuya özel mantığı Start() metoduna yazmaktır. Ancak Start() metodu, hem sunucu hem de istemci dahil olmak üzere, o GameObject'in tüm kopyalarında (instance) çağrılır. Bu, eğer hem sunucu hem de istemci aynı makinede çalışıyorsa (örneğin editörde test ederken), kodunuzun iki kez veya yanlış yerde çalışmasına neden olabilir.

OnStartServer() ise bu sorunu ortadan kaldırır. Sadece NetworkServer başlatıldığında ve o GameObject'in sunucu tarafındaki kopyasında çağrılır. Bu sayede, sunucuya özel başlatma mantığınızın yanlışlıkla istemci tarafında veya gereksiz yere çalışmasını engellersiniz. Unity ağ programlama projelerinizde kaynak yönetimi ve mantık ayrımı için bu farkı iyi anlamak çok önemlidir.


using Mirror;
using UnityEngine;

public class GameManager : NetworkBehaviour
{
    public override void OnStartServer()
    {
        base.OnStartServer(); // Temel sınıf metodunu çağırmak iyi bir alışkanlıktır.
        Debug.Log("Sunucu başarıyla başlatıldı! Oyun yöneticisi hazır.");
        // Sunucuya özel başlatma mantığı buraya gelir.
        InitializeGameData();
        SpawnInitialObjects();
    }

    private void InitializeGameData()
    {
        // Veritabanından oyun verilerini yükle
        Debug.Log("Oyun verileri sunucuda başlatılıyor...");
    }

    private void SpawnInitialObjects()
    {
        // Oyuncular bağlanmadan önce haritaya statik nesneler yerleştir
        Debug.Log("Başlangıçtaki nesneler sunucuda oluşturuluyor...");
        // Örnek: NetworkServer.Spawn(somePrefab);
    }

    // Start() metodu hem client hem de server'da çalışır, dikkat!
    void Start()
    {
        if (isServer)
        {
            Debug.Log("Start() metodu sunucuda çalıştı.");
        }
        if (isClient)
        {
            Debug.Log("Start() metodu istemcide çalıştı.");
        }
    }
}

OnStartServer() ile Yapılabilecekler (Örnekler)

Sunucuya Özel Nesneleri Oluşturma

Oyun dünyasında sadece sunucunun bilmesi ve yönetmesi gereken nesneler olabilir (örneğin, düşman üreticileri, loot sandıkları, özel olay tetikleyicileri). Bu nesneleri OnStartServer() içinde NetworkServer.Spawn() ile oluşturmak, onların sadece sunucu tarafından kontrol edilmesini ve gerektiğinde istemcilere senkronize edilmesini sağlar.


public GameObject enemySpawnerPrefab;

public override void OnStartServer()
{
    base.OnStartServer();
    if (enemySpawnerPrefab != null)
    {
        GameObject spawnerInstance = Instantiate(enemySpawnerPrefab);
        NetworkServer.Spawn(spawnerInstance);
        Debug.Log("Düşman üreticisi sunucuda oluşturuldu ve ağa eklendi.");
    }
}

Oyun Durumunu Başlatma

Oyunun genel durumunu (örneğin, puan tabloları, tur sayaçları, harita bilgileri) ilk kez kurmak için OnStartServer() idealdir. Bu veriler genellikle sunucu tarafından yönetilir ve istemcilere gerektiğinde gönderilir.

Dış Servis Entegrasyonları

Eğer oyununuz bir veritabanına, dış bir API'ye veya harici bir kimlik doğrulama servisine bağlanıyorsa, bu bağlantıları OnStartServer() içinde kurmak mantıklıdır. Bu sayede, sunucu başlatılırken tüm gerekli servisler hazır hale gelir.

Pratik İpuçları

  1. Doğru Yeri Seçin: Sunucuya özel başlatma mantığınızı asla Start() veya Awake() gibi her yerde çalışan metotlara koymayın. Her zaman OnStartServer() kullanın. İstemciye özel başlatma için ise OnStartClient() veya OnStartLocalPlayer() gibi metotları değerlendirin. Bu ayrım, karmaşık Unity ağ programlama projelerinde hataları önler.
  2. Sadece Sunucuya Özel Mantık: OnStartServer() içine sadece sunucunun sorumluluğunda olan kodları yazın. Kullanıcı arayüzü güncellemeleri veya yerel oyuncuya özel işlemler gibi client tarafı mantık bu metoda ait değildir.
  3. Hata Ayıklama İçin Loglama: Sunucu başlatma sürecinde ne olup bittiğini anlamak için bolca Debug.Log() kullanın. Hangi metodun ne zaman çağrıldığını görmek, olası sorunları tespit etmenize yardımcı olacaktır.

Yaygın Hatalar ve Çözümleri

  • Hata: OnStartServer() içindeki kodun istemcide de çalışacağını düşünmek. Çözüm: OnStartServer() sadece sunucuda çalışır. İstemci tarafında bir başlatma gerekiyorsa OnStartClient() veya OnStartLocalPlayer() kullanın. Eğer genel bir başlatma gerekiyorsa ve hem sunucuda hem de istemcide farklı davranışlar sergilemesini istiyorsanız, Start() içinde isServer veya isClient kontrolü yapın.
  • Hata: NetworkManager veya NetworkServer henüz tam olarak hazır olmadan işlem yapmaya çalışmak. Çözüm: OnStartServer(), NetworkManager'ın başlatma döngüsünün doğru bir noktasında çağrılır. Ancak yine de, bazı çok özel durumlarda (örneğin, başka bir NetworkBehaviour'ın OnStartServer()'ından bir şeye erişmeye çalışırken), bağımlılıkların doğru sırada yüklendiğinden emin olmak için dikkatli olun.
  • Hata: Ağ ile ilişkili olmayan UI güncellemeleri veya yerel görsel efektler için OnStartServer() kullanmak. Çözüm: Bu tür işlemler genellikle istemci tarafındadır. OnStartClient() veya Start() metodunu isClient kontrolü ile kullanmak daha doğru olacaktır.

Performans ve Optimizasyon Notları

OnStartServer() metodu, bir sunucu oturumu başladığında yalnızca bir kez çağrılır. Bu nedenle, bu metodun içindeki kodun anlık kare hızı (frame rate) üzerindeki etkisi genellikle önemsizdir. Ancak, çok yoğun veya zaman alıcı işlemler (örneğin, yüzlerce GB'lık veri tabanını ilk kez yüklemek veya karmaşık yapay zeka grafiklerini önceden hesaplamak) sunucunun başlatılma süresini uzatabilir.

Eğer OnStartServer() içinde gerçekten çok uzun sürecek işlemleriniz varsa:

  • Bu işlemleri asenkron (asynchronous) hale getirmeyi düşünün ve sunucunun başlatılmasını engellemek yerine arka planda çalıştırın.
  • Kullanıcılara sunucunun hala başlatılmakta olduğunu gösteren bir yükleme ekranı veya durum mesajı sağlamayı düşünün.

Genel olarak, OnStartServer() içindeki kodun temiz, odaklanmış ve olabildiğince hızlı çalışmasına özen göstermek, sunucunuzun hızlı ve sorunsuz bir şekilde kullanıma hazır olmasını sağlayacaktır. Bu, etkili Unity ağ programlama uygulamalarının temelidir.

Sonuç

OnStartServer() metodu, Unity'de Mirror ile Unity ağ programlama yaparken sunucu tarafı başlatma mantığını yönetmek için güçlü ve gerekli bir araçtır. Bu metodu doğru bir şekilde anlamak ve kullanmak, çok oyunculu oyunlarınızın sağlam, güvenilir ve performansı yüksek olmasını sağlar. Sunucuya özel kurulumları, nesne oluşturmaları ve dış servis entegrasyonlarını bu metoda yerleştirerek, hem kodunuzu daha düzenli hale getirir hem de olası hataların önüne geçersiniz. Unutmayın, sunucu ve istemci arasındaki mantık ayrımı, başarılı bir ağ oyununun temel direğidir.

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