Cómo conectarse a la base de datos desde Unity

Estoy intentando conectarme a una base de datos MS SQL a través de Unity. Sin embargo, cuando trato de abrir una conexión, obtengo una IOException: Conexión perdida.

He importado System.Data.dll desde Unity \ Editor \ Data \ Mono \ lib \ mono \ 2.0. Estoy usando el siguiente código:

using UnityEngine; using System.Collections; using System.Data.Sql; using System.Data.SqlClient; public class SQL_Controller : MonoBehaviour { string conString = "Server=myaddress.com,port;" + "Database=databasename;" + "User ID=username;" + "Password=password;"; public string GetStringFromSQL() { LoadConfig(); string result = ""; SqlConnection connection = new SqlConnection(conString); connection.Open(); Debug.Log(connection.State); SqlCommand Command = connection.CreateCommand(); Command.CommandText = "select * from Artykuly2"; SqlDataReader ThisReader = Command.ExecuteReader(); while (ThisReader.Read()) { result = ThisReader.GetString(0); } ThisReader.Close(); connection.Close(); return result; } } 

Este es el error que obtengo:

 IOException: Connection lost Mono.Data.Tds.Protocol.TdsComm.GetPhysicalPacketHeader () Mono.Data.Tds.Protocol.TdsComm.GetPhysicalPacket () Mono.Data.Tds.Protocol.TdsComm.GetByte () Mono.Data.Tds.Protocol.Tds.ProcessSubPacket () Mono.Data.Tds.Protocol.Tds.NextResult () Mono.Data.Tds.Protocol.Tds.SkipToEnd () Rethrow as TdsInternalException: Server closed the connection. Mono.Data.Tds.Protocol.Tds.SkipToEnd () Mono.Data.Tds.Protocol.Tds70.Connect (Mono.Data.Tds.Protocol.TdsConnectionParameters connectionParameters) Mono.Data.Tds.Protocol.Tds80.Connect (Mono.Data.Tds.Protocol.TdsConnectionParameters connectionParameters) 

Por favor, haga caso omiso de los riesgos de seguridad con este enfoque, NECESITO hacer esto para las pruebas, la seguridad vendrá después. Gracias por tu tiempo.

Por favor, ignore los riesgos de seguridad con este enfoque

No lo hagas así No importa si la seguridad vendrá antes o después. Terminará de volver a escribir todo el código porque la contraseña está codificada en su aplicación y puede descomstackrse y recuperarse fácilmente . Haga la conexión de la manera correcta ahora para que no tenga que volver a escribir toda la aplicación.

Ejecute su comando de base de datos en su servidor con php, perl o cualquier idioma con el que se sienta cómodo, pero esto debe hacerse en el servidor.

Desde Unity, use la clase WWW o UnityWebRequest para comunicarse con esa secuencia de comandos y luego, podrá enviar y recibir información de Unity al servidor. Hay muchos ejemplos por ahí . Incluso con esto, aún necesita implementar su propia seguridad, pero esto es mucho mejor de lo que tiene ahora.

También puede recibir datos múltiples con json .

A continuación se muestra un ejemplo completo de esta wiki de Unity. Muestra cómo interactuar con una base de datos en Unity usando php en el lado del servidor y Unity + C # en el lado del cliente.

Lado del servidor :

Agregar puntaje con PDO :

 An error has ocurred.
', $e->getMessage() ,'

'; } $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 '

An error has ocurred.

', $e->getMessage() ,'

'; } } ?>

Recuperar puntaje con PDO :

 An error has occurred.
', $e->getMessage() ,'

'; } $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"; } } ?>

Habilitar política de dominio cruzado en el servidor :

Este archivo debe llamarse “crossdomain.xml” y colocarse en la raíz de su servidor web. Unity requiere que los sitios web a los que desea acceder a través de una solicitud WWW tengan una política de dominio cruzado.

     

Lado Cliente / Unidad :

El código de cliente de Unity se conecta al servidor, interactúa con PDO y agrega o recupera puntaje según la función a la que se llame. Este código de cliente se modifica ligeramente para comstackr con la última versión de 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'); } 

Esto es solo un ejemplo de cómo hacer esto correctamente. Si necesita implementar la característica de sesión y preocuparse por la seguridad, consulte el protocolo OAuth 2.0 . Debería haber bibliotecas existentes que ayudarán a comenzar con el protocolo OAuth .