Unity’de multiplayer oyun geliştirmek istiyorsanız, Photon Engine en popüler çözümlerden biridir. Özellikle Photon Unity Networking (PUN), sunucu altyapısı ile uğraşmadan çok oyunculu oyunlar geliştirmeyi kolaylaştırır. Bu yazıda Photon PUN kullanarak multiplayer oyun geliştirmeye temel bir giriş yapacağız.

Photon Mimarisi
Photon, oyun sunucularınızı sizin yerinize yöneten bir bulut hizmetidir. Kendi sunucunuzu kurmak ve yönetmek zorunda kalmazsınız. Bu sayede oyun mantığınıza odaklanabilirsiniz.
Temel Akış
Bağlantı: Oyuncu, Photon Master Server’a bağlanır.
Lobi: Master Server, oyuncuyu uygun bir lobiye yönlendirir. Lobi, oyuncuların birbirini görmediği ve yalnızca oda listesinin görülebildiği bekleme alanıdır.
Oda: Lobi üzerinden oyuncular bir odada buluşur. Oda, oyun oturumunun gerçekleştiği izole alandır.
Örnek: 4 kişilik bir yarış oyununda oyuncular önce lobiye gelir, daha sonra odalara girerler ve oyuna başlarlar.
Master Client ve Otorite
Odadaki ilk oyuncu Master Client olur. Master Client, oyun başlatma veya bazı oda ayarlarını değiştirme gibi ek yetkilere sahiptir. Eğer Master Client odadan çıkarsa, Photon otomatik olarak başka bir oyuncuyu Master Client yapar.
Kurulum ve Eşleştirme
1. AppID Alma ve Unity’ye Entegre Etme
Photon Dashboard üzerinden ücretsiz bir AppID alın.
Unity’de PUN 2 – Free paketini kurun.
Kurulum sihirbazına AppID’yi yapıştırın.
2. Bağlantı Kodu
Unity’de genellikle Start() metodunda şöyle bağlanırsınız:
using Photon.Pun;
void Start() {
PhotonNetwork.ConnectUsingSettings(); // Master Server'a bağlan
}
3. Lobiler ve Odalar
Lobby: Oyuncuların rastgele eşleştirildiği bekleme alanı.
Room: Oyun oturumunun gerçekleştiği alan.
Örnek fonksiyonlar:
// Lobiye bağlan
PhotonNetwork.JoinLobby();
// Rastgele oda bul veya oluştur
PhotonNetwork.JoinRandomOrCreateRoom();
// Belirli oda oluştur
PhotonNetwork.CreateRoom("Oda1", new RoomOptions { MaxPlayers = 4 });

Ağ Nesneleri ve Senkronizasyon
Multiplayer oyunlarda nesneleri ağ üzerinde senkronize etmek çok önemlidir. Bunun için PhotonView kullanılır.
PhotonView ve Instantiate
Ağda senkronize olacak her GameObject’in PhotonView bileşeni olmalıdır.
Normal
InstantiateyerinePhotonNetwork.Instantiatekullanılır.Prefab’ler Resources klasöründe olmalıdır.
PhotonNetwork.Instantiate("PlayerPrefab", spawnPosition, Quaternion.identity);
- Oyuncular sadece kendi karakterlerini kontrol etmelidir:
if(photonView.IsMine)

Veri Senkronizasyonu
Pozisyon, sağlık veya skor gibi veriler iki şekilde senkronize edilir:
Gözlemleme (Observing): PhotonTransformView veya IPunObservable kullanarak veri paylaşılır.
Güvenilirlik: Paketler reliable veya unreliable olarak gönderilebilir. Reliable garantili teslimat sağlar, unreliable ise daha hızlıdır ancak kayıp olabilir.
Olay İletişimi: RPC ve RaiseEvent
RPC (Remote Procedure Call)
RPC, bir nesnenin fonksiyonunu ağ üzerinden çağırır.
[PunRPC]
void TakeDamage(int amount) {
health -= amount;
}
// Çağrı
photonView.RPC("TakeDamage", RpcTarget.All, 10);
RpcTarget.All: Herkese gönderir.RpcTarget.Others: Sadece diğerlerine gönderir.RpcTarget.MasterClient: Sadece Master Client’a gönderir.
RaiseEvent
RaiseEvent, belirli bir PhotonView’a bağlı olmayan genel olayları göndermek için kullanılır. Örneğin, “oyun başladı” mesajını tüm odadaki oyunculara iletmek için uygun bir yöntemdir.

İpuçları ve Öneriler


Photon PUN, özellikle hızlı prototipleme ve giriş seviyesindeki multiplayer projeler için mükemmel bir başlangıç noktasıdır. Bu rehberdeki kod örnekleri ve tablolar, oyunlarınızı adım adım oluşturmanızı kolaylaştırır. Daha büyük ve karmaşık projeler geliştirmeyi planlıyorsanız, Photon’un Fusion veya Quantum gibi gelişmiş çözümlerini de inceleyebilirsiniz.





