Ç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ı
- Otomatik Lobiye Katılma (
AutoJoinLobby) Kontrolü: Photon, varsayılan olarakPhotonNetwork.AutoJoinLobby = trueayarı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ıfalseyapıpOnConnectedToMaster()içinde manuel olarakPhotonNetwork.JoinLobby()çağırmalısınız. Bu, Photon Lobby’ye Katılma sürecinde size daha fazla kontrol sağlar. - Lobiye Katılmadan Oda İşlemleri:
PhotonNetwork.AutoJoinLobbyayarıfalseise ve lobiye manuel olarak katılmadıysanız,CreateRoomveyaJoinRoomgibi 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. - Oda Listesini Güncelleme:
OnJoinedLobby()tetiklendiğindePhotonNetwork.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çinOnRoomListUpdate()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
- Master Sunucuya Bağlanmadan Lobiye Katılma: En yaygın hatalardan biri,
PhotonNetwork.ConnectUsingSettings()ile master sunucuya bağlanmadanPhotonNetwork.JoinLobby()çağırmaya çalışmaktır. Çözüm: Her zamanOnConnectedToMaster()içinde veya bu callback’in tetiklendiğinden emin olduktan sonraJoinLobby()çağırın. OnJoinedLobby()‘nin Tetiklenmemesi: EğerAutoJoinLobbytrue ise ve sizJoinLobby()‘yi manuel olarak çağırıyorsanız, zaten lobide olabileceğiniz içinOnJoinedLobby()tetiklenmeyebilir. Çözüm:PhotonNetwork.InLobbykontrolü yaparak gereksiz çağrıları önleyin veyaAutoJoinLobby‘yifalseyapıp manuel kontrol sağlayın.- 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çinOnRoomListUpdate()callback’ini kullanın. - Yanlış Lobi Tipi Kullanımı: Özellikle
SQLlobilerle ç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 durumdaTypedLobby.Defaultyeterlidir.
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.



