Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Bagaimana menghubungkan ke database dari Unity

Harap abaikan risiko keamanan apa pun dengan pendekatan ini

Jangan lakukan seperti ini . Tidak masalah apakah keamanan akan datang sebelum atau sesudahnya. Anda akan mengakhiri penulisan ulang seluruh kode karena sandi dikodekan dalam aplikasi Anda yang dapat didekompilasi dan diambil dengan mudah . Lakukan koneksi dengan cara yang benar sekarang sehingga Anda tidak perlu menulis ulang seluruh aplikasi.

Jalankan perintah database Anda di server Anda dengan php, perl, atau bahasa apa pun yang Anda sukai, tetapi ini harus dilakukan di server.

Dari Unity, gunakan WWW atau UnityWebRequest kelas untuk berkomunikasi dengan skrip itu dan kemudian, Anda akan dapat mengirim dan menerima informasi dari Unity ke server. Ada banyak contoh di luar sana. Bahkan dengan ini, Anda masih perlu menerapkan keamanan Anda sendiri tetapi ini jauh lebih baik daripada yang Anda miliki sekarang.

Anda juga dapat menerima banyak data dengan json.

Di bawah ini adalah contoh lengkap dari wiki Unity ini. Ini menunjukkan bagaimana berinteraksi dengan database di Unity menggunakan php di sisi server dan Unity + C# di sisi klien.

Sisi Server :

Tambahkan skor dengan PDO :

<?php
        // Configuration
        $hostname = 'localhot';
        $username = 'yourusername';
        $password = 'yourpassword';
        $database = 'yourdatabase';

        $secretKey = "mySecretKey"; // Change this value to match the value stored in the client javascript below 

        try {
            $dbh = new PDO('mysql:host='. $hostname .';dbname='. $database, $username, $password);
        } catch(PDOException $e) {
            echo '<h1>An error has ocurred.</h1><pre>', $e->getMessage() ,'</pre>';
        }

        $realHash = md5($_GET['name'] . $_GET['score'] . $secretKey); 
        if($realHash == $hash) { 
            $sth = $dbh->prepare('INSERT INTO scores VALUES (null, :name, :score)');
            try {
                $sth->execute($_GET);
            } catch(Exception $e) {
                echo '<h1>An error has ocurred.</h1><pre>', $e->getMessage() ,'</pre>';
            }
        } 
?>
 

Ambil skor dengan PDO :

<?php
    // Configuration
    $hostname = 'localhost';
    $username = 'yourusername';
    $password = 'yourpassword';
    $database = 'yourdatabase';

    try {
        $dbh = new PDO('mysql:host='. $hostname .';dbname='. $database, $username, $password);
    } catch(PDOException $e) {
        echo '<h1>An error has occurred.</h1><pre>', $e->getMessage() ,'</pre>';
    }

    $sth = $dbh->query('SELECT * FROM scores ORDER BY score DESC LIMIT 5');
    $sth->setFetchMode(PDO::FETCH_ASSOC);

    $result = $sth->fetchAll();

    if(count($result) > 0) {
        foreach($result as $r) {
            echo $r['name'], "\t", $r['score'], "\n";
        }
    }
?>
 

Aktifkan kebijakan lintas domain di server :

File ini harus diberi nama "crossdomain.xml" dan ditempatkan di root server web Anda. Unity mengharuskan situs web yang ingin Anda akses melalui Permintaan WWW memiliki kebijakan lintas domain.

<?xml version="1.0"?>
<cross-domain-policy>
<allow-access-from domain="*"/>
</cross-domain-policy>
 

Sisi Klien/Persatuan :

Kode klien dari Unity terhubung ke server, berinteraksi dengan PDO dan menambah atau mengambil skor tergantung pada fungsi yang dipanggil. Kode klien ini sedikit dimodifikasi untuk dikompilasi dengan versi Unity terbaru.

private string secretKey = "mySecretKey"; // Edit this value and make sure it's the same as the one stored on the server
public string addScoreURL = "http://localhost/unity_test/addscore.php?"; //be sure to add a ? to your url
public string highscoreURL = "http://localhost/unity_test/display.php";

//Text to display the result on
public Text statusText;

void Start()
{
    StartCoroutine(GetScores());
}

// remember to use StartCoroutine when calling this function!
IEnumerator PostScores(string name, int score)
{
    //This connects to a server side php script that will add the name and score to a MySQL DB.
    // Supply it with a string representing the players name and the players score.
    string hash = Md5Sum(name + score + secretKey);

    string post_url = addScoreURL + "name=" + WWW.EscapeURL(name) + "&score=" + score + "&hash=" + hash;

    // Post the URL to the site and create a download object to get the result.
    WWW hs_post = new WWW(post_url);
    yield return hs_post; // Wait until the download is done

    if (hs_post.error != null)
    {
        print("There was an error posting the high score: " + hs_post.error);
    }
}

// Get the scores from the MySQL DB to display in a GUIText.
// remember to use StartCoroutine when calling this function!
IEnumerator GetScores()
{
    statusText.text = "Loading Scores";
    WWW hs_get = new WWW(highscoreURL);
    yield return hs_get;

    if (hs_get.error != null)
    {
        print("There was an error getting the high score: " + hs_get.error);
    }
    else
    {
        statusText.text = hs_get.text; // this is a GUIText that will display the scores in game.
    }
}

public string Md5Sum(string strToEncrypt)
{
    System.Text.UTF8Encoding ue = new System.Text.UTF8Encoding();
    byte[] bytes = ue.GetBytes(strToEncrypt);

    // encrypt bytes
    System.Security.Cryptography.MD5CryptoServiceProvider md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
    byte[] hashBytes = md5.ComputeHash(bytes);

    // Convert the encrypted bytes back to a string (base 16)
    string hashString = "";

    for (int i = 0; i < hashBytes.Length; i++)
    {
        hashString += System.Convert.ToString(hashBytes[i], 16).PadLeft(2, '0');
    }

    return hashString.PadLeft(32, '0');
}
 

Ini hanyalah sebuah contoh tentang cara melakukan ini dengan benar. Jika Anda perlu menerapkan fitur sesi dan memperhatikan keamanan, lihat OAuth 2.0 protokol. Seharusnya ada pustaka yang ada yang akan membantu memulai OAuth protokol.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SqlDataSourceEnumerator.Instance.GetDataSources() tidak menemukan contoh SQL server 2008 lokal

  2. Gunakan NEWID() untuk Membuat Nilai Unik di SQL Server

  3. 3 Cara Mendapatkan Hari Pertama Bulan Ini di SQL Server

  4. DATETIMEFROMPARTS() Contoh di SQL Server (T-SQL)

  5. Cara Meningkatkan Ukuran Lampiran yang Diizinkan Saat Mengirim Email di SQL Server (T-SQL)