Unity C# ve PHP Mysql Kullanımı

Unity C# ve PHP Mysql Kullanımı

PHP Kodlama 13 Kasım 2021 - 16:22:18 32 Gösterim 0 Yorum

Online oyun olarak adlandırabileceğimiz oyuncu verileri, skor vb verileri veritabanında saklayarak oyuncuları yarıştırabilmenize olanak tanıyan sistemi aktaracağım sizlere. Aslında işin içine girmeden önce oldukça karmaşık gelen şeyler, işin içine girdikten sonra oldukça kolay gelmeye başladı. Bir form ile bugün sunucudaki hesaba bağlantı kuralım. Yavaş yavaş Fullstack developere doğru gidiyoruz bakalım :) Vakit kaybetmeden hemen Unity içinde bir kanvas 2 input ve bir buton oluşturup kodlarımızı yazmaya başlayalım.

1# Unity için Giriş Ekranı oluşturma işlemi

Giriş ekranımızı tasarladık. Önce bir Canvas oluşturduk ve içerisine bir parola bir de e-posta girebileceğimiz bir alan. Daha sonra giriş işlemini başlatacak yani submit yapacak butonumuzu  da koyduk. Şimdi C# dosyamızı oluşturup componentlerimizi içerisine atalım.

2 Login C# Scripti Oluşturma..

İlk olarak IEnumerator oluşturmamız gerekiyor. Giriş işlemini yapacak olan kısım bu. Hemen kodlarımızı hazırlayalım. 

   IEnumerator Giris()
    {
        WWWForm veriler = new WWWForm();
        veriler.AddField("e-posta", e_posta.text);
        veriler.AddField("sifre", sifre.text);

        UnityWebRequest baglanti = UnityWebRequest.Post("http://localhost/test.php", veriler);
        yield return baglanti.SendWebRequest();

        Json = baglanti.downloadHandler.text;
    }

Ben Localhost ile verileri test edeceğim için URL'im bu. Siz isterseniz sunucuda da gerçekleştirebilirsiniz. Şimdi script dosyamıza componentlerimizi public şekilde tanımlayalım..

 public InputField e_posta, sifre;
    public Button giris_yap;
    public string Json;

Burada 2 adet input bir adet buton birde string değişkeni tanımladık. String değişkenimiz Json olarak alacağımız çıktıyı oyun ekranında işlemek için bize yeterli olacaktır. Yani Şu haliyle script dosyamızı da paylaşalım:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.UI;

public class Login : MonoBehaviour

  

{
    public InputField e_posta, sifre;
    public Button giris_yap;
    public string Json;
       void Start()
    {
        
    }

    void Update()
    {
        
    }

    IEnumerator Giris()
    {
        WWWForm veriler = new WWWForm();
        veriler.AddField("e-posta", e_posta.text);
        veriler.AddField("sifre", sifre.text);

        UnityWebRequest baglanti = UnityWebRequest.Post("http://localhost/test.php", veriler);
        yield return baglanti.SendWebRequest();

        Json = baglanti.downloadHandler.text;
    }


}

Burada 2 adet Classı eklememiz gerekiyor. 

using UnityEngine.Networking;
using UnityEngine.UI;

Networking bağlantı yapmamızı sağlayan UnityWebRequest'i kullanmamızı sağlayacak. UI ise oluşturduğumuz componentler için gerekli. Şimdi oluşturduğumuz bu scripti Canvasımıza ekleyelim.

Ardından oluşturduğumuz inputfiledleri ve butonu sürükleyerek gerekli alanlara ekleyelim. Şimdilik işin Unity kısmı tamam. Sadece bağlantıyı yaptırıp kontrol ettirmek kalıyor. Onuda butonla yapacağız. Buradan sonraki kısım PHP ve Mysql veritabanı ile.

İlk olarak bir veritabanı oluşturalım ve ona bağlantı sağlayalım.

Hemen bir veritabanı oluşturdum. Daha sonra bir tablo ve tabloya otomatik artan bir user_id, mail ve sifre verilerini saklayacağım alanlar oluşturdum. Şimdi test.php dosyamızı kodlayalım.

<?php 
error_reporting(0);
try{
    $db = new PDO('mysql:host=localhost;dbname=test;','root','');
    $db->exec("SET NAMES 'utf8'; SET CHARSET 'utf8'");
}
catch(PDOException $e)
{
    die($e->getMessage());
}

if(isset($_POST['e-posta']) && isset($_POST['sifre']))
{

    $sql=$db->prepare('SELECT * FROM user WHERE user_mail=? AND user_sifre=?');
    $sql->execute(array($_POST['e-posta'],$_POST['sifre']));
    $kontrol=$sql->rowCount();

    if($kontrol)
    {
        $data['mesaj']='Böyle bir Kullanıcı Var';
    }else
    {
        $data['mesaj']='Böyle bir Kullanıcı Yok';
    }



}

echo json_encode($data);

Error_reporting ile hataların gözükmesini kapattık. Ardından Try Catch ile PDO bağlantımızı kurduk. Daha sonra if ile posttan gelen e-posta ve sifre verilerinin var olup olmadığını sorduk. Eğer varsa işlem yap diye şartladık. Daha sonra rowCount() ile kontrol ettik. Kontrolün durumuna göre bir mesaj yazdırdık ve son olarak onu json olarak çevirdik. Şimdi yapmamız gereken Unity ekranındaki iki inputu doldurup test olarak göndermek. Ben kaz.uslu@gmail.com ve 123456 şifreleri ile bir test kullanıcı oluşturdum. Şimdi login.cs dosyamıza geri dönelim ve aksiyonlarımızı hazırlayalım. Şimdi birde kulanıcıya mesaj göstereceğimiz bir txt oluşturalım.

 public InputField e_posta, sifre;
    public Button giris_yap;
    string Json;
    public Text mesaj;

Componentlerime birde Text oluşturdum mesaj isminde. Daha sonra onuda sürükleyip Canvasa eklediğim script dosyamın altında açılan text alanına attım.

Şimdi daha güzel oldu. En azından gelen mesaja göre bir mesaj gösterebiliriz. Böylece sistemin çalışıp çalışmadığını anlarız. Şimdi geçebiliriz login.cs dosyamızdaki işlemlerimize. İlk yapmak istediğim e-posta ve şifre için oluşturduğum inputların kontrolü yani oraya birşeyler yazılmadan işlem yapılmasın. Hemen butona atayacağımız bir void oluşturalım.

public bool giris_dene;

İlk olarak boolean bir değişken oluşturdum. Bunu butona bastıkça değişecek şekilde ayarlayacağım. Oluşturduğum bu giris_dene değerini başlangıçta false olacak şekilde start'ın içerisine ekliyorum.

  void Start()
    {
        giris_dene = false;
    }

Şimdide butonumuz için voidimizi yazalım.

public void buton_giris()
    {
        if (e_posta.text.Length < 1 && sifre.text.Length < 1)
            return;

        giris_dene = true;

    }

Burada e_posta ve sifre isimde olusturduğumuz inputfieldlerin içerisi boşsa bitir şeklinde bir şartlama ekledik. Eğer dolu ise giris_dene değerini TRUE yaptık. Böylece Update kısmına ekleyeceğimiz kodlara geçebiliriz.

 void Update()
    {
        if(giris_dene == true)
        {
            StartCoroutine(Giris());
            giris_dene = false;
        }

        if(Json.Length > 5)
           Debug.Log(Json);
        


    }

Update kısmında ise giris_dene değeri TRUE ise StartCoroutine ile giriş yapmamızı sağlayacak Giris ismindeki IEnumerator'ü çalıştırdık. Daha sonra tekrar tekrar çalışmaması için giris_dene değerini tekrar False yaptık. Ardından da JSON string değişkenimizin içerisi 5'den büyükse Debug ekranına eklettik. Şimdi C# dosyamızın son halini paylaşalım.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.UI;

public class Login : MonoBehaviour

  

{
    public InputField e_posta, sifre;
    public Button giris_yap;
    string Json;
    public Text mesaj;
    public bool giris_dene;
       void Start()
    {
        giris_dene = false;
    }

    void Update()
    {
        if(giris_dene == true)
        {
            StartCoroutine(Giris());
            giris_dene = false;
        }

        if(Json.Length > 5)
           Debug.Log(Json);
        


    }

    public void buton_giris()
    {
        if (e_posta.text.Length < 1 && sifre.text.Length < 1)
            return;

        giris_dene = true;

    }


    IEnumerator Giris()
    {
        WWWForm veriler = new WWWForm();
        veriler.AddField("e-posta", e_posta.text);
        veriler.AddField("sifre", sifre.text);

        UnityWebRequest baglanti = UnityWebRequest.Post("http://localhost/test.php", veriler);
        yield return baglanti.SendWebRequest();

        Json = baglanti.downloadHandler.text;
    }


}

Şimdide butonumuza buton_giris() voidini atayalım. Bunu iki aşamayla yapabiliriz. İlk olarak Unity ekranından yapalım.

Butonun inceptor panelinde göreceğiniz OnClick bölümünün hemen altındaki + işaretine tıklayın. Gelen ekranda Runtime Only kısmının altına Login.cs dosyamızı atadığımız Canvası sürükleyin ardından sağ tarafta Login > buton_giris seçin. İşlem tamamdır. Veya kod ile de ekleyebiliriz.

 void Update()
    {

        giris_yap.onClick.AddListener(() => buton_giris());

        if(giris_dene == true)
        {
            StartCoroutine(Giris());
            giris_dene = false;
        }

        if(Json.Length > 5)
           Debug.Log(Json);
        


    }

Update alanının içerisine daha önce giris_yap isminde oluşturduğumuz butona yukarıdaki şekilde atama yapabilirsiniz.

giris_yap.onClick.AddListener(() => buton_giris());

Bu resimdeki ile aynı işi yapacaktır. Şimdi test edelim.

E-posta Adresini ve Şifresini 1 - 1 girdim ve Gelen Json Mesajı yandaki gibi Böyle bir Kullanıcı Yok, oldu. Şimdi ise gerçek bilgileri girelim;

Görüldüğü gibi veriler doğru olduğu için böyle bir kullanıcı var dedi. Şimdi ben ilk test.php dosyamı oluştururken Json_encode etmeyip direk normal text olarak buraya yazdırıp Mesaj componentine atıp bu anlatıyı bitirebilirdim. Ama bu bize yeterli değil. Çünkü sadece bu mesajlar değil, oyuncu verileri, skor, puan, para, sağlık can, hatta ve hatta spawn noktalarını kayıt altında tutacağız ve json dosyası şeklinde anlık oyunlarımıza aktaracağız. Bu nedenle bir eklenti daha kullanmamız gerekecek. Unity'de Json dosyalarını parse etmemizi sağlayan LitJson. Hemen Unity'de projemize Dahil edelim.

Unity ekranında Windows > Pakage Manager kısmını açın ve Litjson'u bulun.

Import ederek projemize dahil edelim. Bulamayanlar için Asset Store linki:

https://assetstore.unity.com/packages/tools/network/litjson-ruler-48492

Import ettikten sonra Login.cs dosyamıza dahil edelim.

using LitJson;

Şimdi artık gelen Json dosyalarını parse edebiliriz.

Hemen Update içindeki Debug.Log içerisinde çalıştırdığımız Json çıktısını parse edip, Mesaj alanında yayınlayalım.

        if (Json.Length > 5)
        {
            var sonuc = JsonMapper.ToObject(Json);
            mesaj.text = sonuc["mesaj"].ToString();
        }

İşlem başarılı mı bi kontrol edelim::

Görüldüğü gibi sorunsuz bir şekilde çalışıyor. Giriş başarılı mesajı gelirse oyun ekranına gönderebiliriz vesaire. Artık gerisi sizin kod yazarlığınıza kalmış. Şimdi en son haliyle Login.cs dosyamızı tekrar paylaşalım:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.UI;
using LitJson;

public class Login : MonoBehaviour

  

{
    public InputField e_posta, sifre;
    public Button giris_yap;
    string Json;
    public Text mesaj;
    public bool giris_dene;
       void Start()
    {
        giris_dene = false;
        mesaj.text="";
    }

    void Update()
    {

        giris_yap.onClick.AddListener(() => buton_giris());

        if(giris_dene == true)
        {
            StartCoroutine(Giris());
            giris_dene = false;
        }

        if (Json.Length > 5)
        {
            var sonuc = JsonMapper.ToObject(Json);
            mesaj.text = sonuc["mesaj"].ToString();
        }
            
        


    }

    public void buton_giris()
    {
        if (e_posta.text.Length < 0 && sifre.text.Length < 0)
            return;

        giris_dene = true;

    }


    IEnumerator Giris()
    {
        WWWForm veriler = new WWWForm();
        veriler.AddField("e-posta", e_posta.text);
        veriler.AddField("sifre", sifre.text);

        UnityWebRequest baglanti = UnityWebRequest.Post("http://localhost/test.php", veriler);
        yield return baglanti.SendWebRequest();

        Json = baglanti.downloadHandler.text;

    }


}

Sorunsuz hatasız kod yazmalar diliyorum :) 

Yorum Yapılmamış

Bu yazıya henüz bir yorum yapılmamış, hemen bir tane yapmak ister misin ?

Yorum Yapın