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 ?