Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como se conectar ao banco de dados do Unity


Por favor, desconsidere quaisquer riscos de segurança com esta abordagem

Não faça assim . Não importa se a segurança virá antes ou depois. Você terminará de reescrever todo o código porque a senha é codificado em seu aplicativo que pode ser descompilado e recuperado facilmente . Faça a conexão da maneira correta agora para que você não precise reescrever todo o aplicativo.

Execute seu comando de banco de dados em seu servidor com php, perl ou qualquer linguagem com a qual você se sinta confortável, mas isso deve ser feito no servidor.

No Unity, use o WWW ou UnityWebRequest class para se comunicar com esse script e, em seguida, você poderá enviar e receber informações do Unity para o servidor. Há muitos exemplos por aí. Mesmo com isso, você ainda precisa implementar sua própria segurança, mas isso é muito melhor do que o que você tem agora.

Você também pode receber dados múltiplos com json.

Abaixo está um exemplo completo deste wiki do Unity. Ele mostra como interagir com um banco de dados no Unity usando php no lado do servidor e Unity + C# no lado do cliente.

Lado do servidor :

Adicionar pontuação com 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>';
            }
        } 
?>
 

Recuperar pontuação com 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";
        }
    }
?>
 

Ativar política de domínio cruzado no servidor :

Este arquivo deve ser nomeado "crossdomain.xml" e colocado na raiz do seu servidor web. O Unity exige que os sites que você deseja acessar por meio de uma solicitação WWW tenham uma política de domínio cruzado.
<?xml version="1.0"?>
<cross-domain-policy>
<allow-access-from domain="*"/>
</cross-domain-policy>
 

Lado do cliente/unidade :

O código cliente do Unity se conecta ao servidor, interage com o PDO e adiciona ou recupera pontuação dependendo de qual função é chamada. Este código de cliente é ligeiramente modificado para compilar com a versão mais recente do Unity.
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');
}
 

Este é apenas um exemplo de como fazer isso corretamente. Se você precisar implementar o recurso de sessão e se preocupar com a segurança, consulte o OAuth 2.0 protocolo. Deve haver bibliotecas existentes que ajudarão a começar com o OAuth protocolo.