Merhaba arkadaşlar! Bugün sizlere Unity’de multiplayer oyunlar geliştirmek için sıkça kullanılan Photon kütüphanesini detaylı bir şekilde anlatacağım. Bu yazıda Photon’un nasıl kurulacağını, lobi ve oda oluşturmayı, sunucuya nesne eklemeyi, nesnelerin birbirleriyle nasıl iletişim kuracağını ve en önemlisi RPC (Remote Procedure Call) ve SRC (Server-side Remote Calls) kullanımını inceleyeceğiz.
Hadi başlayalım!
1. Photon Nedir ve Kurulumu Nasıl Yapılır?
Photon, Unity ile çok oyunculu oyunlar geliştirmek için kullanılan bir ağ çözümüdür. Bulut tabanlı yapısı sayesinde kolayca oda ve sunucu yönetimi yapabilir, ağ trafiği ile ilgili karmaşık işlerle uğraşmak zorunda kalmadan oyununuzu online hale getirebilirsiniz. Şimdi Photon’u Unity projemize nasıl kuracağımıza bakalım:
Photon’u Kurma Adımları:
Asset Store Üzerinden Photon Kurulumu:
- Unity’nin üst menüsünden Window -> Asset Store seçeneğine tıklayın.
- Arama çubuğuna “Photon Unity Networking” yazın ve Photon PUN 2 Free paketini bulun.
- Paketi indirip projeye dahil edin.
Photon’a Kayıt Olun:
- Photon kullanmak için bir Photon Cloud hesabına ihtiyacınız var. Photon resmi sitesine giderek bir hesap oluşturun.
- Ücretsiz bir App ID oluşturun. Bu ID, Photon Cloud’a bağlanmanızı sağlar.
App ID’yi Unity’ye Ekleyin:
- Photon’u Unity’de aktif etmek için PhotonSettings dosyasını açın (menüde: Window -> Photon Unity Networking -> Highlight Settings).
- Photon App ID’nizi bu alana yapıştırın. Artık Photon kullanıma hazır!
2. Lobi ve Oda Oluşturma
Multiplayer bir oyunda oyuncuları bir araya getirmek için genellikle lobi ve oda sistemlerine ihtiyaç duyarız. Lobi, oyuncuların oda seçip bir oyuna katılabilecekleri alanlardır. Odalar ise oyuncuların bir araya geldiği, oyunların gerçekleştiği sanal alanlardır.
Lobi Oluşturma
Photon’da lobi otomatik olarak oluşturulur. Bizim yapmamız gereken, oyuncunun lobiye bağlandığında hangi odaları görebileceğini ayarlamaktır.
using Photon.Pun;
using UnityEngine;
public class MultiplayerLobby : MonoBehaviourPunCallbacks
{
void Start()
{
// Photon sunucusuna bağlan
PhotonNetwork.ConnectUsingSettings();
}
// Bağlantı başarılı olursa
public override void OnConnectedToMaster()
{
Debug.Log("Sunucuya bağlandı!");
// Lobiye gir
PhotonNetwork.JoinLobby();
}
// Lobiye başarılı bir şekilde bağlanıldığında
public override void OnJoinedLobby()
{
Debug.Log("Lobiye bağlandı!");
}
}
Yukarıdaki kod, oyuncunun Photon sunucusuna bağlanmasını ve başarılı bir şekilde lobiye girdiğini gösterir.
Oda Oluşturma ve Odaya Katılma
Oyuncular lobide bulunduklarında ya bir odaya katılırlar ya da yeni bir oda oluştururlar.
using Photon.Pun;
using Photon.Realtime;
using UnityEngine;
public class RoomManager : MonoBehaviourPunCallbacks
{
// Oda oluşturma
public void CreateRoom()
{
PhotonNetwork.CreateRoom("Oda1", new RoomOptions { MaxPlayers = 4 });
}
// Odaya katılma
public void JoinRoom()
{
PhotonNetwork.JoinRoom("Oda1");
}
public override void OnJoinedRoom()
{
Debug.Log("Odaya katıldınız!");
}
public override void OnCreateRoomFailed(short returnCode, string message)
{
Debug.Log("Oda oluşturma başarısız: " + message);
}
}
3. Sunucuya Nesne Ekleme
Bir multiplayer oyun yaratırken, oyuncuların birbirleriyle etkileşime geçmesi önemlidir. Photon, PhotonNetwork.Instantiate komutunu kullanarak sunucuya nesne eklemeyi ve bu nesnenin tüm oyuncular arasında paylaşılmasını sağlar.
using Photon.Pun;
using UnityEngine;
public class PlayerSpawner : MonoBehaviour
{
void Start()
{
// Oyuncu prefab'ını sunucuda oluştur ve tüm oyunculara paylaş
PhotonNetwork.Instantiate("PlayerPrefab", new Vector3(0, 0, 0), Quaternion.identity);
}
}
Bu kod, oyuncu oyuna girdiğinde “PlayerPrefab” adlı oyuncu modelini sunucuda oluşturur ve tüm oyunculara bu model gönderilir.
4. Nesnelerin Birbirleriyle İletişimi: RPC Kullanımı
Multiplayer oyunlarda nesneler arasında mesaj gönderimi oldukça önemlidir. Photon’da, bir oyuncunun yaptığı bir hareketin diğer oyunculara iletilmesi için RPC (Remote Procedure Call) kullanılır.
using Photon.Pun;
using UnityEngine;
public class PlayerActions : MonoBehaviourPun
{
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
// Zıplama hareketini tüm oyunculara ilet
photonView.RPC("Jump", RpcTarget.All);
}
}
[PunRPC]
void Jump()
{
Debug.Log("Zıplama gerçekleşti!");
}
}
Bu kod ile bir oyuncu zıpladığında, diğer oyuncular da bu zıplamayı görür.
5. Sunucu Tabanlı İletişim (SRC)
Bazı durumlarda, oyunun mantığı sunucu tarafından yönetilmelidir. Photon’da bu tip işlemler için Master Client denilen bir yapı vardır. Sunucunun kontrolünde olan oyuncu, diğer oyunculara göre belirleyici olur.
[PunRPC]
void DoSomething()
{
if (PhotonNetwork.IsMasterClient)
{
// Sunucu tarafından yapılacak işlem
Debug.Log("Bu işlem yalnızca sunucuda çalışır!");
}
}
6. Bonus: Multiplayer Chat Sistemi
Multiplayer oyunlarda oyuncuların birbiriyle iletişim kurması için chat sistemi oluşturmak oldukça basittir. Photon üzerinden mesaj göndererek bu işlemi yapabiliriz.
using Photon.Pun;
using UnityEngine;
using UnityEngine.UI;
public class ChatManager : MonoBehaviourPun
{
public InputField chatInput;
public Text chatDisplay;
public void SendMessage()
{
if (!string.IsNullOrEmpty(chatInput.text))
{
photonView.RPC("ReceiveMessage", RpcTarget.All, chatInput.text);
chatInput.text = "";
}
}
[PunRPC]
void ReceiveMessage(string message)
{
chatDisplay.text += "\n" + message;
}
}
Sonuç olarak, Photon kullanarak multiplayer oyun geliştirme sürecinizi oldukça kolaylaştırabilirsiniz. Lobi ve oda sisteminden tutun da oyuncu kontrolleri ve chat sistemi gibi detaylara kadar her şeyi Photon ile entegre edebilirsiniz. Unutmayın, multiplayer oyun geliştirme karmaşık olabilir ama Photon sayesinde işinizi büyük oranda kolaylaştırabilirsiniz!