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

Photon ile Oda Oluşturma: `PhotonNetwork.CreateRoom()` Metodu Rehberi

Paylaşan: Unity Eğitim 15 December 2025 9 dakika okuma 164 görüntülenme

Giriş: `PhotonNetwork.CreateRoom()` Nedir?

Çok oyunculu oyunlar geliştirirken, oyuncuların bir araya gelip etkileşim kurabileceği sanal alanlara ihtiyaç duyarız. Bu alanlara genellikle 'oda' denir. Unity projelerinde Photon PUN (Photon Unity Networking) kullanıyorsanız, bu odaları oluşturmanın anahtarı PhotonNetwork.CreateRoom() metodudur. Bu metot, bir oyuncunun yeni bir oyun oturumu başlatması ve diğer oyuncuların bu odaya katılması için temel bir mekanizma sunar. Başarılı bir Photon Oda Oluşturma süreci, oyuncularınız için kesintisiz ve keyifli bir deneyimin başlangıcıdır.

Bu makalede, PhotonNetwork.CreateRoom() metodunun detaylarına inecek, nasıl kullanılacağını öğrenecek, yaygın hataları ve çözümlerini inceleyecek ve performans ipuçları sunacağız. Amacımız, Unity ve Photon ile çok oyunculu oyun geliştirme yolculuğunuzda size kapsamlı bir rehber sunmaktır.

`PhotonNetwork.CreateRoom()` Metodunun Temelleri

PhotonNetwork.CreateRoom(), sunucu üzerinde yeni bir oyun odası oluşturmak için kullanılan merkezi bir metottur. Bu metot genellikle üç ana parametre alır:

  1. roomName (string): Oluşturulacak odanın benzersiz adı. Eğer bu isimde bir oda zaten varsa, oluşturma işlemi başarısız olur.
  2. roomOptions (RoomOptions): Odanın özelliklerini belirleyen bir nesne. Bu, odanın kaç oyuncu alabileceği, lobide görünüp görünmeyeceği gibi önemli ayarları içerir.
  3. typedLobby (TypedLobby): Odanın hangi lobiye ait olacağını belirtir. Photon, farklı oyun türleri veya bölgeler için farklı lobiler kullanmanıza olanak tanır.

RoomOptions Sınıfının Önemi

RoomOptions sınıfı, Photon Oda Oluşturma işleminin temelini oluşturur ve odanızın davranışını belirleyen çeşitli özellikler sunar:

  • MaxPlayers (byte): Odaya katılabilecek maksimum oyuncu sayısı.
  • IsOpen (bool): Oda yeni oyuncuların katılımına açık mı? (Varsayılan: true)
  • IsVisible (bool): Oda lobi listesinde görünüyor mu? (Varsayılan: true)
  • CustomRoomProperties (Hashtable): Odaya özel, anahtar-değer çiftleri şeklinde depolanan veriler (örneğin, harita adı, oyun modu).
  • CustomRoomPropertiesForLobby (string[]): CustomRoomProperties içinden lobide görüntülenecek veya filtrelenecek özelliklerin anahtarları. Bu, lobideki oyuncuların oda listesini filtrelemesine olanak tanır.
  • CleanupCacheOnLeave (bool): Bir oyuncu odadan ayrıldığında, o oyuncuya ait RaiseEvent'ler aracılığıyla gönderilen tüm olayların (örneğin, Instantiate RPC'leri) temizlenip temizlenmeyeceği. (Varsayılan: true)

`TypedLobby` Nedir ve Ne İşe Yarar?

TypedLobby, odaların gruplandırıldığı mantıksal bir yapıdır. Farklı lobiler, farklı oyun türlerini veya bölgeleri ayırmak için kullanılabilir. En yaygın türler şunlardır:

  • TypedLobby.Default: Varsayılan lobi türü. Genellikle çoğu proje için yeterlidir.
  • TypedLobby.SqlLobby: SQL benzeri sorgularla odaları filtrelemenize olanak tanır. Daha gelişmiş filtreleme ihtiyaçları için kullanılır.
  • TypedLobby.WebLobby: Sunucu tarafında özel web servisleri ile entegrasyon için kullanılır.

İşte basit bir Photon Oda Oluşturma örneği:


using UnityEngine; 
using Photon.Pun; 
using Photon.Realtime; 

public class RoomCreator : MonoBehaviourPunCallbacks 
{
    public byte maxPlayersPerRoom = 4;
    public string roomNamePrefix = "MyAwesomeRoom";

    void Start()
    {
        // Photon sunucusuna bağlı olduğunuzdan emin olun.
        // Genellikle ConnectUsingSettings() ile bağlanılır.
        if (!PhotonNetwork.IsConnected)
        {
            Debug.LogError("Photon sunucusuna bağlı değil! Önce bağlanın.");
            return;
        }

        CreateNewRoom();
    }

    void CreateNewRoom()
    {
        RoomOptions roomOptions = new RoomOptions();
        roomOptions.MaxPlayers = maxPlayersPerRoom;
        roomOptions.IsOpen = true;
        roomOptions.IsVisible = true;

        // Özel oda özellikleri ekleyebiliriz
        ExitGames.Client.Photon.Hashtable customProps = new ExitGames.Client.Photon.Hashtable();
        customProps["map"] = "ForestMap";
        customProps["gameMode"] = "Deathmatch";
        roomOptions.CustomRoomProperties = customProps;
        roomOptions.CustomRoomPropertiesForLobby = new string[] { "map", "gameMode" };

        // Benzersiz bir oda adı oluşturmak için GUID kullanabiliriz
        string uniqueRoomName = roomNamePrefix + System.Guid.NewGuid().ToString().Substring(0, 8);

        PhotonNetwork.CreateRoom(uniqueRoomName, roomOptions, TypedLobby.Default);
        Debug.Log($"Oda oluşturma isteği gönderildi: {uniqueRoomName}");
    }

    public override void OnCreateRoomFailed(short returnCode, string message)
    {
        Debug.LogError($"Oda oluşturma başarısız oldu: {returnCode} - {message}");
        // Hata durumunda kullanıcıya bilgi verilebilir veya yeniden denenebilir.
    }

    public override void OnJoinedRoom()
    {
        Debug.Log($"Odaya başarıyla katıldı: {PhotonNetwork.CurrentRoom.Name}");
        // Odaya katıldıktan sonra oyun sahnesine geçiş yapılabilir.
    }
}

Oda Oluşturma Başarısız Olduğunda: `OnCreateRoomFailed`

PhotonNetwork.CreateRoom() çağrısı her zaman başarılı olmayabilir. Örneğin, aynı isimde bir oda zaten mevcutsa veya sunucuda bir hata oluşursa, işlem başarısız olur. Bu gibi durumları yönetmek için MonoBehaviourPunCallbacks sınıfından türettiğiniz script'inizde OnCreateRoomFailed callback metodunu override etmeniz gerekir. Bu metot, size bir hata kodu (returnCode) ve açıklayıcı bir mesaj (message) sağlar.


public override void OnCreateRoomFailed(short returnCode, string message)
{
    Debug.LogError($"Oda oluşturma başarısız oldu: {returnCode} - {message}");
    // Kullanıcıya "Oda oluşturulamadı, lütfen başka bir isim deneyin" gibi bir mesaj gösterebilirsiniz.
    // Ya da otomatik olarak yeni bir isimle tekrar deneme mekanizması kurabilirsiniz.
}

Odaya Başarıyla Katıldığınızda: `OnJoinedRoom`

PhotonNetwork.CreateRoom() metodu aslında iki şeyi yapar: bir oda oluşturur ve sonra sizi o odaya katmaya çalışır. Eğer Photon Oda Oluşturma ve odaya katılma işlemi başarılı olursa, OnJoinedRoom callback metodu tetiklenir. Bu, genellikle oyunun bir sonraki aşamasına geçmek (örneğin, oyun sahnesini yüklemek) veya odanın özelliklerini kontrol etmek için ideal bir yerdir.


public override void OnJoinedRoom()
{
    Debug.Log($"Odaya başarıyla katıldı: {PhotonNetwork.CurrentRoom.Name}");
    Debug.Log($"Odadaki oyuncu sayısı: {PhotonNetwork.CurrentRoom.PlayerCount}/{PhotonNetwork.CurrentRoom.MaxPlayers}");
    // PhotonNetwork.LoadLevel("GameScene"); gibi bir komutla oyun sahnesine geçebilirsiniz.
}

Pratik İpuçları ve En İyi Uygulamalar

İpucu 1: Dinamik Oda İsimleri Kullanın

Sabit oda isimleri kullanmak, birden fazla oyuncunun aynı anda oda oluşturmaya çalıştığında çakışmalara yol açabilir. Bunun yerine, benzersiz oda isimleri oluşturmak için System.Guid.NewGuid().ToString() veya zaman damgalarını kullanabilirsiniz. Bu, oda oluşturma başarısızlıklarını azaltır ve daha sorunsuz bir deneyim sunar.


string uniqueRoomName = "Room_" + System.Guid.NewGuid().ToString().Substring(0, 8);
// Veya
// string uniqueRoomName = "Room_" + System.DateTime.Now.Ticks.ToString();

İpucu 2: Özel Oda Özellikleri ile Filtreleme

RoomOptions.CustomRoomProperties ve RoomOptions.CustomRoomPropertiesForLobby kullanarak odalarınıza harita adı, oyun modu, zorluk seviyesi gibi özel veriler ekleyebilirsiniz. Bu özellikler, oyuncuların lobi ekranında odaları filtrelemesine veya arama yapmasına olanak tanır, böylece istedikleri türdeki oyunları daha kolay bulabilirler. Bu, Photon Oda Oluşturma sürecini daha işlevsel hale getirir.

İpucu 3: Oda Görünürlüğünü ve Erişilebilirliğini Yönetin

RoomOptions.IsVisible ve RoomOptions.IsOpen özelliklerini kullanarak odanızın lobide görünüp görünmeyeceğini veya yeni oyuncuların katılımına açık olup olmadığını kontrol edebilirsiniz. Örneğin, sadece davetle girilebilen özel odalar oluşturmak için IsVisible = false ve IsOpen = false ayarlayabilirsiniz. Bu durumda, oyuncuların odaya katılabilmesi için doğrudan oda ismini bilmeleri veya davet edilmesi gerekir.

İpucu 4: Lobi Türlerini Akıllıca Kullanın

Eğer oyununuzda farklı oyun modları (örneğin, 'Battle Royale' ve 'Team Deathmatch') veya farklı bölgeler varsa, bunları ayrı lobilerde tutmak, oyuncuların sadece ilgili odaları görmesini sağlar ve lobi performansını artırabilir. TypedLobby.Default yerine new TypedLobby("BattleRoyaleLobby", LobbyType.Default) gibi özel lobiler tanımlayabilirsiniz.

Yaygın Hatalar ve Çözümleri

Hata 1: Aynı İsimde Oda Oluşturmaya Çalışmak

Sorun: PhotonNetwork.CreateRoom() çağrısı, aynı isimde bir oda zaten mevcutsa başarısız olur ve OnCreateRoomFailed tetiklenir (hata kodu 32766).

Çözüm: Yukarıda bahsedildiği gibi dinamik ve benzersiz oda isimleri kullanın. Eğer yine de çakışma olursa, OnCreateRoomFailed içinde kullanıcıya bilgi verin ve yeni bir isimle tekrar deneme seçeneği sunun veya otomatik olarak yeni bir isim oluşturup tekrar deneyin.

Hata 2: `RoomOptions`'ı Yanlış Yapılandırmak

Sorun: MaxPlayers'ı 0 olarak bırakmak veya IsOpen/IsVisible ayarlarını yanlış yapmak, odanın beklediğiniz gibi çalışmamasına neden olabilir.

Çözüm: RoomOptions nesnesini oluştururken tüm ilgili özelliklerin doğru şekilde ayarlandığından emin olun. Özellikle MaxPlayers'ın 0'dan büyük bir değer olduğundan ve odanın görünür olmasını istiyorsanız IsVisible = true olduğundan emin olun.

Hata 3: Callback'leri Göz Ardı Etmek

Sorun: OnCreateRoomFailed ve OnJoinedRoom callback'lerini uygulamamak, oda oluşturma işleminin başarılı olup olmadığını veya bir sorun olup olmadığını bilmenizi engeller. Kullanıcıya geri bildirim veremezsiniz.

Çözüm: Her zaman bu iki callback metodunu uygulayın. Kullanıcı arayüzünde (UI) durum mesajları göstermek veya hata durumlarında uygun adımları atmak için bu callback'leri kullanın. Bu, Photon Oda Oluşturma deneyiminin önemli bir parçasıdır.

Hata 4: Sunucuya Bağlanmadan Oda Oluşturmak

Sorun: PhotonNetwork.ConnectUsingSettings() ile Photon sunucusuna bağlanmadan PhotonNetwork.CreateRoom() çağırmaya çalışmak hataya yol açar.

Çözüm: Oda oluşturma işleminden önce PhotonNetwork.IsConnectedAndReady kontrolünü yapın. Eğer bağlı değilseniz, önce sunucuya bağlanın ve OnConnectedToMaster callback'i tetiklendikten sonra oda oluşturma işlemini başlatın.

Performans ve Optimizasyon Notları

  • Gereksiz Oda Oluşturmaktan Kaçının: Her oyuncu her zaman yeni bir oda oluşturmak yerine, mevcut bir odaya katılmayı denemeli veya uygun bir oda bulamazsa yeni bir oda oluşturmalıdır. Bu, sunucu kaynaklarının verimli kullanılmasını sağlar.
  • `RoomOptions`'ı Optimize Edin: CustomRoomProperties içinde çok büyük veya gereksiz veriler göndermekten kaçının. Sadece lobide filtreleme veya odanın temel ayarları için gerekli olan bilgileri saklayın. Her oda oluşturma isteği, bu verileri sunucuya gönderir ve sunucuda depolanır.
  • Lobi Türlerinin Performansı: Çoğu küçük ve orta ölçekli oyun için TypedLobby.Default yeterlidir ve performans açısından büyük bir fark yaratmaz. Ancak çok sayıda oda ve oyuncu içeren büyük ölçekli oyunlarda, farklı lobi türleri (özellikle SqlLobby) sorgulama performansını artırabilir.

Sonuç

PhotonNetwork.CreateRoom() metodu, Unity ile çok oyunculu oyun geliştirirken odaları yönetmenin temelidir. Bu rehberde, metodun nasıl kullanılacağını, RoomOptions ve TypedLobby gibi önemli parametrelerini, hata ve başarı callback'lerini, pratik ipuçlarını ve yaygın hataları ele aldık. Bu bilgileri kullanarak, oyuncularınız için sağlam ve işlevsel bir Photon Oda Oluşturma sistemi kurabilirsiniz. Unutmayın, iyi bir çok oyunculu deneyim, sağlam bir oda yönetiminden başlar!

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