Unity MYSQL Bağlantısı (Hesap Oluşturma ve Giriş Kontrolü)
Unity MYSQL Bağlantısı (Hesap Oluşturma ve Giriş Kontrolü)
Hepinize merhaba arkadaşlar bu yazımda sizlere Unity de nasıl oyununuza kullanıcı girişi ve oyuncunun hesap oluşturma sistemini yapacağınızdan bahsedeceğim, aslında oldukça kolay bir yöntem ile bunları kontrol edebiliyorsunuz burada tek gereken şey aslında web tasarımı konusunda biraz bilginizin olması gerektiği çünkü Unity de MYSQL bağlantısını direkt olarak C# ile değil bir internet sitesi üzerinden Unity de bulunan WWW yapıları ile yapıyoruz.
WWW ve WWWForm nedir bilmeyenleriniz varsa direkt konu hakkında araştırma yapmadan buraya gelenleriniz onları bir buradaki yazıya alayım, WWW ve WWWForm hakkında bilgi edindikten sonra gelip buraya baktığınız zaman çok daha rahat bir şekilde burada anlatmak istediğimi anlayacağınızı düşünüyorum.
Mantığın Kavranması
Bir programı ezbere kullanabilirsiniz ama yazılımda böyle bir şey aslında pek de mümkün olmuyor bu yüzden bu işin kısaca bir mantığından size bahsetmek istiyorum, yani WWW kullanarak nasıl Unity üzerinden MySQL bağlantısı kurulur bunun mantığını kavrayalım, sistem nasıl çalışır görelim.
İlk olarak kullanıcının verilerini Database e gönderebilmek için PHP ile basit bir script yazıyoruz, ben bu proje için 2 adet Php sayfası kodladım. İlki kullanıcı hesabı oluşturmak için diğeri ise kullanıcı girişini yapabilmesi için.
Daha sonrasında Unity de ara yüzü oluşturduktan sonra MySQLHelper isimli bir C# dosyası oluşturdum ve içerisinden kullanıcıdan gelen verileri gerekli sayfalara yönlendirmesini ve siteden gelen dönütlere göre ekrana Debug çıktısı yazdırmasını sağladım.
Veri Tabanı ve Web Kısmının Yapılması
Veri Tabanı Oluşturulması
Web Scriptlerinin Yazılması
<?PHP
$host = "localhost"; // MySQL Host
$host_username = "root"; // MySQL kullanıcı adı
$host_password = "root"; // MySQL şifresi
$host_database = "deneme"; // MySQL veri tabanı
?><?PHP
include "config.php"; // config.php yi çağırıyoruz
if(isset($_POST["kullaniciAdi"], $_POST["sifre"])){ // Kullanıcı adı ve şifre verileri gelmişmi kontrol ediyoruz.
try{ // Hata denetleyicisi başlatıyoruz
$kullaniciAdi = $_POST["kullaniciAdi"]; // Gelen kullanıcı adı verisini kullaniciAdi değişkenine atıyoruz.
$sifre = $_POST["sifre"]; // Gelen şifre verisini sifre değişkenine atıyoruz
$baglanti = new PDO("mysql:host=".$host.";dbname=".$host_database."" , $host_username, $host_password); // veri tabanına bağlanıyoruz.
$baglanti -> exec("SET NAMES utf8"); // Veri tabanında karakter hatası yaşamamak için karakter setini değiştiriyoruz.
$baglanti -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // Hataları denetliyoruz..
$sorgu = $baglanti -> query("SELECT * FROM hesaplar WHERE kadi = '$kullaniciAdi' && pass = '$sifre'", PDO::FETCH_ASSOC); // Veri tablosuna bağlanıyoruz ve kullanıcıyı arıyoruz.
if($sorgu->rowCount()){ // Kullanıcı varsa
echo "1"; // ekrana 1 yazdırıyoruz
}else{
echo "0"; // Kullanıcı yoksa ekrana 0 yazdırıyoruz.
}
// Not : buradaki 1 ve 0 ile Unity de kullanıcıya farklı yazılar yazdırmak için kullanabiliriz
}catch(PDOException $e){ // Herhangi bir sorun ile karşılaşılmışmı denetliyoruz
die($e->getMessage()); // Hata var ise hatayı ekrana yazdırıyoruz.
// Not: Bu hata yazdırması aslında çok riskli olduğunu söyleyebilirim eğerki oyununuzu profesyonel anlamda yayımlayacaksanız bu kısmıda yukarıdaki gibi 0 1 yerine 2 - 3 gibi sayılar ile daha detaylı bir hale getirebilirsiniz, tabi bu sizin php bilginize kalmış.
}
}
?><?PHP
include "config.php"; // config.php çağırıyoruz
if(isset($_POST["kullaniciAdi"], $_POST["mail"], $_POST["sifre"])){ // Kullanıcıdan veri gelmişmi kontrol ediyoruz.
try{ // hata kontrolcüsü başlatıyoruz
$kullaniciAdi = $_POST["kullaniciAdi"]; // Gelen kullanıcı adını kullaniciAdi değişkenine atıyoruz.
$mail = $_POST["mail"]; // Gelen mail verisini mail değişkenine atıyoruz.
$sifre = $_POST["sifre"]; // Gelen şifre verisini sifre değişkenine atıyoruz.
$baglanti = new PDO("mysql:host=".$host.";dbname=".$host_database."" , $host_username, $host_password); // Veri tabanına bağlanıyoruz.
$baglanti -> exec("SET NAMES utf8"); // Veri tabanı ile karakter sıkıntısı yaşamamak için karakter tipini set ediyoruz.
$baglanti -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // Hata vb... ayıklacıları açıyoruz
$sorgu = $baglanti -> prepare("INSERT INTO hesaplar(kadi, mail, pass) VALUES(?,?,?)"); // hesaplar veri tablosuna bağlanıyor ve veri göndericem sana diyoruz
$sorgu -> bindParam(1, $kullaniciAdi, PDO::PARAM_STR); // isim verisini gönderiyoruz
$sorgu -> bindParam(2, $mail, PDO::PARAM_STR); // mail verisini gönderiyoruz
$sorgu -> bindParam(3, $sifre, PDO::PARAM_STR); // şifre verisini gönderiyoruz
$sorgu -> execute(); // göderdiğimiz verileri veri tablosuna yazdırıyoruz
echo "1"; // herhangi bir sorun çıkmadığı için 1 yazarak dönüt veriyoruz.
}catch(PDOException $e){ // hataları yakalıyoruz
die($e->getMessage()); // herhangi bir hata ile karşılaştıysak bu hatayı yazdırıyoruz.
}
}
Unity Kodlarının Yazılması
MySQLHelper
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.SceneManagement; // Sahne değiştirmek için kullandığımız kütüphane
public class MYSQLHelper:MonoBehaviour
{
[SerializeField] // Değişkene Inspector penceresinden erişilmesini sağlıyoruz.
private string hesapOlusturURL = ""; // Hesap oluştur bağlantısı için değişken oluşturuyoruz.
[SerializeField] // Değişkene Inspector penceresinden erişilmesini sağlıyoruz.
private string girisYapURL = ""; // Giriş yap bağlantısı için değişken oluşturuyoruz.
// Her yerden ulaşabilmek için HesapOlustur ve GirisYap adında iki adet değişken oluşturuyor ve içerisine
// StartCoroutine içinde kullanacağımız asıl fonksiyonları çağırıyoruz.
public void HesapOlustur(string kullaniciAdi, string ePosta, string sifre){
StartCoroutine(_HesapOlustur(kullaniciAdi, ePosta, sifre));
}
public void GirisYap(string kullaniciAdi, string sifre, int acilacakSayfa){
StartCoroutine(_GirisYap(kullaniciAdi, sifre , acilacakSayfa));
}
// Giriş yapıldıysa geçerli sahneyi yeniden yüklemesi için bir fonksiyon yazdım,
public void GirisYapildi(int sahneID){
PlayerPrefs.SetInt("giris", 1); // PlayerPrefs ile kullanıcının giriş yapıp yapmadığının verisini tutuyorum ve böylelikle kullanıcıya sürekli olarak giriş ekranı göstermiyorum.
// yukarıdaki playerprefs 1 ise giriş yapılmış anlamına geliyor.
SceneManager.LoadScene(sahneID, LoadSceneMode.Single); // Sahneyi yeniden yüklüyorum
}
IEnumerator _HesapOlustur(string kullaniciAdi, string ePosta, string sifre)
{
yield return new WaitForEndOfFrame(); // Son karenin gelmesi bekleniyor
WWWForm hesapOlusturmaForm = new WWWForm(); // WWW form oluşturuyorum
hesapOlusturmaForm.AddField("kullaniciAdi", kullaniciAdi); // Kullanıcı adı verisini forma ekliyorum
hesapOlusturmaForm.AddField("mail", ePosta); // Mail verisini forma ekliyorum
hesapOlusturmaForm.AddField("sifre", sifre); // Şifre verisini forma ekliyorum
WWW veriGonder = new WWW(hesapOlusturURL, hesapOlusturmaForm); // WWW ile veri gönderilmesi için siteye bağlanıyorum
yield return veriGonder; // Veriyi gönderiyorum
if(veriGonder.text == "1"){ // Siteden 1 yanıtı geldiyse
Debug.Log("Hesap oluşturma başarılı"); // Giriş başarılı dedirtiyorum
}else{
Debug.Log("Hesap oluştururken bir sorun ile karşılaşıldı! \nSorun sende değil bende. :')"); // Siteden 1 dışında bir yanıt gelirse sorun var yazısı yazıdırıyorum
}
}
IEnumerator _GirisYap(string kullaniciAdi, string sifre, int acilacakSayfa){
yield return new WaitForEndOfFrame(); // Son karenin gelmesi bekleniyor
WWWForm girisYapForm = new WWWForm(); // WWW Form oluşturuyorum
girisYapForm.AddField("kullaniciAdi", kullaniciAdi); // Kullanıcı adı bilgisini forma ekliyorum
girisYapForm.AddField("sifre", sifre); // Şifre bilgisini forma ekliyorum
WWW veriGonder = new WWW(girisYapURL, girisYapForm); // Forma eklediğim verileri WWW ile siteye gönderiyorum
yield return veriGonder; // Siteye verileri gönderdim
if(veriGonder.text == "1"){ // Siteden gelen veri 1 ise
Debug.Log("Giriş Yapıldı"); // Giriş yapıldı diyorum
GirisYapildi(acilacakSayfa); // Giriş yapıldı fonksiyonunu çağırıyorum
}else if(veriGonder.text == "0"){ // Gelen veri 0 ise
Debug.Log("Kullanıcı adı veya şifre hatalı!"); // Şifre veya kullanıcı adı yanlış diyorum
}else { // Farklı bir veri geldiyse siteden
Debug.Log("Giriş yapılırken bir sorun ile karşılaşıldı! \nSorun sende değil bende :')"); // Hata mesajı bastırıyorum
}
}
}
UIManager
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class UIManager : MonoBehaviour
{
public GameObject[] paneller; // Ana ekran, giriş ve hesap oluşturma panellerini buraya atıyorum ve arasında geçiş sağlayabiliyorum.
public MYSQLHelper _mysqlHelper; // Yazdığımız MySQL Helper Scriptini buraya sürükleyeceğiz ve oradaki fonksiyonlara bunun ile erişeceğiz.
public InputField _hesapOlusturKullaniciAdi; // Hesap oluştur paneli kullanıcı adı girdisi
public InputField _hesapOlusturSifre; // Hesap oluştur paneli şifre girdisi
public InputField _hesapOlusturEPosta; // Hesap oluştur paneli e posta girdisi
public InputField _girisYapKullaniciAdi; // Giriş paneli kullanı adı girdisi
public InputField _girisYapSifre; // Giriş paneli şifre girdisi
// Panellerin sıralanışı
// 0 AnaEkran
// 1 Giriş Paneli
// 2 Hesap Oluşturma Paneli
void Awake(){
if(PlayerPrefs.GetInt("giris") == 1){ // Kullanıcı giriş yapmışmı kontrol ediyorum
GirisEkraniKapat(); // Giriş yapmışsa giriş ve hesap oluştur panelini kapatıyorum
}
}
// Giriş ve hesap oluştur panelini kapatmak için yazdığım fonksiyon
public void GirisEkraniKapat(){
paneller[0].SetActive(false); // ana paneli kapatır
paneller[1].SetActive(false); // giriş panelini kapatır
paneller[2].SetActive(false); // hesap oluşturma panelini kapatır
}
// Giriş yap butonuna tıklandığı zaman çalışan fonksiyon
public void GirisYap(){
_mysqlHelper.GirisYap(_girisYapKullaniciAdi.text, _girisYapSifre.text, 0); // MYSQLHelper scriptindeki girişyap fonksiyonunu çağırıyor ve gerekli bilgileri gönderiyor
}
// Hesap oluştur butonuna tıklandığı zaman çalışan fonksiyon
public void HesapOlustur(){
_mysqlHelper.HesapOlustur(_hesapOlusturKullaniciAdi.text, _hesapOlusturEPosta.text, _hesapOlusturSifre.text); // MySQL helper scriptinde hesap oluştur fonksiyonunu çağırıyor ve gerekli bilgileri gönderiyor
}
// Giriş yap panelini açar veya kapatır
public void GirisPaneliAcKapat()
{
if (paneller[0].activeSelf)
{
paneller[0].SetActive(false);
paneller[2].SetActive(false);
paneller[1].SetActive(true);
}
else if (paneller[0].activeSelf == false)
{
paneller[0].SetActive(true);
paneller[1].SetActive(false);
paneller[2].SetActive(false);
}
}
// Kayır ol panelini açar veya kapatır
public void KayitPaneliAcKapat()
{
if (paneller[0].activeSelf)
{
paneller[0].SetActive(false);
paneller[1].SetActive(false);
paneller[2].SetActive(true);
}
else if (paneller[0].activeSelf == false)
{
paneller[0].SetActive(true);
paneller[1].SetActive(false);
paneller[2].SetActive(false);
}
}
}


13 yorum
Sunucunuz lokal ağda ise başka bilgisayarlar tarafından verinin erişilmemesi gayet normal. Global bir network, web sunucusu ile deneme yapmanızı öneriyorum.
Sorun sende değil bende. :' bu hatayı alıyorum sebebi nedir ?