Se venligst bort fra eventuelle sikkerhedsrisici med denne tilgang
Gør det ikke på denne måde . Det er lige meget, om sikkerheden kommer før eller efter. Du slutter med at genskrive hele koden, fordi adgangskoden er hårdkodet i din applikation, som kan dekompileres og hentes let . Foretag forbindelsen på den rigtige måde nu, så du ikke behøver at omskrive hele applikationen.
Kør din databasekommando på din server med php, perl eller et hvilket som helst sprog, du er fortrolig med, men dette bør gøres på serveren.
Fra Unity skal du bruge WWW
eller UnityWebRequest
klasse til at kommunikere med det script, og derefter vil du være i stand til at sende og modtage information fra Unity til serveren. Der er mange eksempler derude. Selv med dette, skal du stadig implementere din egen sikkerhed, men dette er meget bedre end det, du har nu.
Du kan også modtage flere data med json.
Nedenfor er et komplet eksempel fra denne Unity-wiki. Den viser, hvordan man interagerer med en database i Unity ved hjælp af php på serversiden og Unity + C# på klientsiden.
Serverside :
Tilføj score med 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>';
}
}
?>
Hent score med 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";
}
}
?>
Aktivér politik på tværs af domæner på serveren :
Denne fil skal hedde "crossdomain.xml" og placeres i roden af din webserver. Unity kræver, at websteder, du ønsker at få adgang til via en WWW-anmodning, har en politik på tværs af domæner.
<?xml version="1.0"?>
<cross-domain-policy>
<allow-access-from domain="*"/>
</cross-domain-policy>
Kunde/Unity Side :
Klientkoden fra Unity forbinder til serveren, interagerer med PDO og tilføjer eller henter score afhængigt af hvilken funktion der kaldes. Denne klientkode er lidt ændret for at kompilere med den seneste Unity-version.
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');
}
Dette er blot et eksempel på, hvordan man gør dette korrekt. Hvis du har brug for at implementere sessionsfunktionen og bekymrer dig om sikkerhed, skal du se på OAuth 2.0 protokol. Der burde være eksisterende biblioteker, der vil hjælpe med at komme i gang med OAuth protokol.