Unity ve PHP PDO Kullanarak Güvenli Liderlik Tablosu (Leaderboard) Yapımı

17.03.2026
Burak Erol
68 Görüntülenme
Unity ve PHP PDO Kullanarak Güvenli Liderlik Tablosu (Leaderboard) Yapımı

Unity ve PHP PDO Kullanarak Güvenli Liderlik Tablosu (Leaderboard) Yapımı

Geliştirdiğiniz mobil veya PC oyunlarında oyuncuların rekabet hissini artırmak için bir Liderlik Tablosu (Leaderboard) eklemek harika bir fikirdir. Unity'nin kendi içinde bir veritabanı tutma yeteneği olmadığı için, skorları kendi sunucunuzda tutmanız gerekir. Bu makalede, Unity (C#) ile PHP/MySQL (PDO) ikilisini konuşturarak nasıl güvenli bir skor sistemi yapabileceğimizi inceleyeceğiz.

Sistemin Çalışma Mantığı

  • Oyuncu bölümü bitirdiğinde Unity, oyuncunun adını ve skorunu bir web isteği (HTTP POST) ile sunucuya gönderir.
  • Sunucudaki PHP dosyası bu isteği karşılar, PDO kullanarak SQL Injection korumalı bir şekilde veritabanına kaydeder.
  • Liderlik tablosu görüntülenmek istendiğinde, Unity tekrar PHP'ye istek atar ve PHP veritabanındaki skorları yüksekten düşüğe doğru sıralayarak JSON formatında Unity'ye yollar.

1) Backend: PHP (PDO) ile Skor Kaydetme

Aşağıdaki PHP kodu, Unity'den gelen skor bilgisini güvenli bir şekilde MySQL veritabanına kaydeder.

<?php
// skor_kaydet.php
include 'baglan.php'; // PDO bağlantınızın olduğu dosya

if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    $oyuncu_adi = htmlspecialchars($_POST['oyuncu_adi']);
    $skor = intval($_POST['skor']); // Sadece rakam kabul ediyoruz (Güvenlik)

    // Güvenli (Prepared Statement) Kayıt
    $kaydet = $db->prepare("INSERT INTO skorlar (oyuncu_adi, skor) VALUES (:ad, :skor)");
    $islem = $kaydet->execute([
        'ad' => $oyuncu_adi,
        'skor' => $skor
    ]);

    if($islem) {
        echo "Başarılı";
    } else {
        echo "Hata";
    }
}
?>

2) Frontend: Unity (C#) ile Veri Gönderme

Eskiden Unity'de bu işlemler için WWW sınıfı kullanılırdı ancak artık yerini çok daha yetenekli olan UnityWebRequest sınıfı aldı.

using System.Collections;
using UnityEngine;
using UnityEngine.Networking;

public class LeaderboardManager : MonoBehaviour
{
    string kayitURL = "https://www.siteniz.com/skor_kaydet.php";

    public void SkorGonder(string oyuncuAdi, int skor)
    {
        StartCoroutine(PostSkor(oyuncuAdi, skor));
    }

    IEnumerator PostSkor(string oyuncuAdi, int skor)
    {
        // Form verilerini hazırlıyoruz
        WWWForm form = new WWWForm();
        form.AddField("oyuncu_adi", oyuncuAdi);
        form.AddField("skor", skor.ToString());

        // Sunucuya isteği gönderiyoruz
        using (UnityWebRequest www = UnityWebRequest.Post(kayitURL, form))
        {
            yield return www.SendWebRequest();

            if (www.result != UnityWebRequest.Result.Success)
            {
                Debug.LogError("Skor Gönderilemedi: " + www.error);
            }
            else
            {
                Debug.Log("Sunucu Cevabı: " + www.downloadHandler.text);
            }
        }
    }
}

Hile Koruması (Anti-Cheat) İçin Bir İpucu

Eğer sadece oyuncu adını ve skoru doğrudan yollarsanız, kötü niyetli biri Postman gibi bir araçla URL'nize sahte istekler atarak skor tablosunu bozabilir. Bunu engellemek için Unity içinden bir "Gizli Hash (Secret Hash)" oluşturup gönderebilir ve PHP tarafında bu hash'i doğrulayarak isteğin gerçekten sizin oyununuzdan geldiğinden emin olabilirsiniz.