Photon Lobby’ye Katılma: Çok Oyunculu Deneyimin Temel Adımı

Unity'de Photon ile çok oyunculu oyunlar geliştirirken PhotonNetwork.JoinLobby() fonksiyonunun ne işe yaradığını, nasıl kullanıldığını ve en iyi uygulamalarını öğrenin.

Çok oyunculu bir oyunun kalbinde, oyuncuların birbirini bulduğu ve maçlara katıldığı bir sistem yatar. Photon Unity Networking (PUN) ile bu sistemin temel taşlarından biri de “lobi”dir. Lobiler, oyuncuların mevcut oyun odalarını görebildiği, kendi odalarını açabildiği veya arkadaşlarının odalarına katılabildiği bekleme alanlarıdır. PhotonNetwork.JoinLobby() fonksiyonu, oyuncularınızı bu merkezi bekleme alanına dahil etmenin anahtarıdır. Bu makalede, Photon Lobby’ye Katılma sürecini detaylı bir şekilde inceleyeceğiz.

Lobi Nedir ve Neden Önemlidir?

Lobi, oyuncuların bir master sunucuya bağlandıktan sonra girdiği ve oyun odaları hakkında bilgi aldığı bir Photon sunucusu bileşenidir. Varsayılan bir lobi (Default) vardır, ancak farklı oyun modları veya bölgeler için özel lobiler de oluşturabilirsiniz. Bir lobiye katılmak, oyuncuların PhotonNetwork.GetRoomList() ile mevcut odaların listesini almasını sağlar. Bu listeler genellikle dinamiktir ve lobi içindeki oda değişiklikleri otomatik olarak güncellenir. Lobiye katıldıktan sonra PhotonNetwork.CreateRoom() veya PhotonNetwork.JoinRoom() gibi fonksiyonları kullanarak oyun odalarına geçiş yapabilirsiniz.

PhotonNetwork.JoinLobby() Kullanımı

Bu fonksiyonu çağırmadan önce, PhotonNetwork.ConnectUsingSettings() ile Photon master sunucusuna bağlı olmanız gerekmektedir. Bağlantı başarılı olduğunda OnConnectedToMaster() callback’i tetiklenir. PhotonNetwork.JoinLobby() genellikle parametresiz olarak çağrılır ve varsayılan lobiye (TypedLobby.Default) katılır. Özel bir lobiye katılmak için PhotonNetwork.JoinLobby(new TypedLobby("MyCustomLobbyName", LobbyType.Default)) gibi bir çağrı yapabilirsiniz. LobbyType SQL veya None olabilir. Bu işlem asenkrondur. Lobiye başarıyla katıldığınızda OnJoinedLobby() callback’i tetiklenir.

Örnek Kod: Lobiye Katılma

using UnityEngine;
using Photon.Pun;
using Photon.Realtime;
using System.Collections.Generic;

public class LobbyManager : MonoBehaviourPunCallbacks
{
    public override void OnConnectedToMaster()
    {
        Debug.Log("Master sunucuya bağlandı!");
        // Otomatik olarak lobiye katılmasını istemiyorsak veya
        // farklı bir lobiye katılmak istiyorsak burada JoinLobby() çağırırız.
        // PhotonNetwork.AutomaticallySyncScene = true; // İsteğe bağlı
        
        if (!PhotonNetwork.InLobby) // Zaten bir lobide değilsek katıl
        {
            Debug.Log("Lobiye katılınıyor...");
            PhotonNetwork.JoinLobby();
        }
    }

    public override void OnJoinedLobby()
    {
        Debug.Log("Lobiye başarıyla katıldı!");
        // Artık odaları listeleyebilir, oda oluşturabilir veya odalara katılabiliriz.
        // Örneğin: PhotonNetwork.CreateRoom("Oda1");
        // Örneğin: UpdateRoomListUI(PhotonNetwork.GetRoomList());
    }

    public override void OnLeftLobby()
    {
        Debug.Log("Lobiden ayrıldı.");
    }

    public override void OnDisconnected(DisconnectCause cause)
    {
        Debug.LogWarningFormat("Bağlantı kesildi: {0}", cause);
        // Bağlantı kesildiğinde lobi durumunu sıfırlayabiliriz.
    }

    // Oyun başladığında otomatik bağlantı
    void Start()
    {
        if (!PhotonNetwork.IsConnected)
        {
            PhotonNetwork.ConnectUsingSettings();
        }
    }

    public override void OnRoomListUpdate(List<RoomInfo> roomList)
    {
        Debug.Log("Oda listesi güncellendi.");
        foreach (RoomInfo info in roomList)
        {
            if (info.RemovedFromList)
            {
                Debug.LogFormat("Oda listeden kaldırıldı: {0}", info.Name);
            }
            else
            {
                Debug.LogFormat("Oda: {0}, Oyuncu Sayısı: {1}/{2}", info.Name, info.PlayerCount, info.MaxPlayers);
            }
        }
        // UI'nizi bu listeye göre güncelleyin.
    }
}

Pratik İpuçları

  1. Otomatik Lobiye Katılma (AutoJoinLobby) Kontrolü: Photon, varsayılan olarak PhotonNetwork.AutoJoinLobby = true ayarıyla gelir. Bu, master sunucuya bağlandığınızda otomatik olarak varsayılan lobiye katılacağınız anlamına gelir. Eğer özel bir lobiye katılmak istiyorsanız veya lobiye katılmadan önce başka işlemler yapmak istiyorsanız bu ayarı false yapıp OnConnectedToMaster() içinde manuel olarak PhotonNetwork.JoinLobby() çağırmalısınız. Bu, Photon Lobby’ye Katılma sürecinde size daha fazla kontrol sağlar.
  2. Lobiye Katılmadan Oda İşlemleri: PhotonNetwork.AutoJoinLobby ayarı false ise ve lobiye manuel olarak katılmadıysanız, CreateRoom veya JoinRoom gibi fonksiyonları doğrudan çağıramazsınız. Bu fonksiyonlar çağrıldığında, Photon otomatik olarak varsayılan lobiye katılmaya çalışır. Eğer özel bir lobi kullanıyorsanız, önce o lobiye katılmanız, ardından oda işlemlerini yapmanız en sağlıklısıdır.
  3. Oda Listesini Güncelleme: OnJoinedLobby() tetiklendiğinde PhotonNetwork.GetRoomList() ile mevcut odaların anlık bir listesini alırsınız. Ancak bu liste dinamik olarak güncellenmez. Odalar oluşturulduğunda veya kapatıldığında bu değişiklikleri takip etmek için OnRoomListUpdate() callback’ini kullanmanız gerekir. Bu callback, lobi içinde oda listesi her değiştiğinde tetiklenir ve size güncel listeyi sağlar.

Yaygın Hatalar ve Çözümleri

  1. Master Sunucuya Bağlanmadan Lobiye Katılma: En yaygın hatalardan biri, PhotonNetwork.ConnectUsingSettings() ile master sunucuya bağlanmadan PhotonNetwork.JoinLobby() çağırmaya çalışmaktır. Çözüm: Her zaman OnConnectedToMaster() içinde veya bu callback’in tetiklendiğinden emin olduktan sonra JoinLobby() çağırın.
  2. OnJoinedLobby()‘nin Tetiklenmemesi: Eğer AutoJoinLobby true ise ve siz JoinLobby()‘yi manuel olarak çağırıyorsanız, zaten lobide olabileceğiniz için OnJoinedLobby() tetiklenmeyebilir. Çözüm: PhotonNetwork.InLobby kontrolü yaparak gereksiz çağrıları önleyin veya AutoJoinLobby‘yi false yapıp manuel kontrol sağlayın.
  3. Eski Oda Listesiyle Çalışma: OnJoinedLobby() içinde alınan oda listesinin her zaman güncel olduğunu varsaymak. Çözüm: Oda listesi dinamik güncellemeleri için OnRoomListUpdate() callback’ini kullanın.
  4. Yanlış Lobi Tipi Kullanımı: Özellikle SQL lobilerle çalışırken yanlış sorgu formatı veya uyumsuz lobi tipleri kullanmak hatalara yol açabilir. Çözüm: Lobi tipinizi ve kullanım amacınızı dikkatlice belirleyin. Çoğu durumda TypedLobby.Default yeterlidir.

Performans ve Optimizasyon Notları

  • Lobi Boyutu: Aynı anda binlerce oyuncunun aynı lobide olması performans sorunlarına yol açabilir. Oyun modlarına veya bölgelere göre özel lobiler oluşturarak yükü dağıtabilirsiniz. Bu, Photon Lobby’ye Katılma deneyimini iyileştirecektir.
  • Oda Listesi Güncelleme Sıklığı: OnRoomListUpdate() callback’i, lobi içindeki oda durumlarında bir değişiklik olduğunda tetiklenir. Eğer çok hızlı oda oluşturma/silme döngüleri varsa, bu callback sıkça tetiklenebilir. UI’nizi güncellerken gereksiz performans kayıplarını önlemek için akıllıca önbellekleme veya gecikmeli güncellemeler kullanabilirsiniz. Örneğin, UI’yi her güncellemede yeniden çizmek yerine, sadece değişen öğeleri güncelleyin.
  • Gereksiz Lobiye Katılma/Ayrılma: Oyun akışınızda sürekli olarak lobiye girip çıkmaktan kaçının. Bu, sunucuya gereksiz yük bindirir ve bağlantı gecikmelerine neden olabilir. Mümkün olduğunca bir lobide kalın ve odalar arasında geçiş yapın.

Sonuç

PhotonNetwork.JoinLobby() fonksiyonu, Photon tabanlı çok oyunculu oyunlarınızda oyuncuların bir araya gelmesini sağlayan temel bir adımdır. Bu fonksiyonu ve ilgili callback’leri doğru bir şekilde anlamak ve uygulamak, sorunsuz ve ölçeklenebilir bir çok oyunculu deneyim için kritik öneme sahiptir. Photon Lobby’ye Katılma sürecini doğru yöneterek oyuncularınıza kusursuz bir başlangıç noktası sunabilirsiniz.

Leave a Reply

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir