Jump to content
Unity Insider Forum

Daten aus MySQL Datenbank bekommen


Damon93

Recommended Posts

Hey freunde,

 

ist es möglich das ich auf meinem Webserver eine datenbank anlegen, und dort dann sagen wir 2-3 integer definiere, und dann in meinem C# script in Unity besagte integer anlege, welche ich aber nicht in dem script mit einem wert zuweiße sondern im grunde den wert der in der Db steht gebeb.

 

Also Pseudocode:

 

int variable = MySQL Datenbank Zelle 1;

 

Klar so einfach wirds net sein aber habe damit noch nie gearbeitet haha wäre cool wenn man mir bisschen tipps geben könnte :D

 

fakt ist ich hab in meiner app ein paar variablen die ich flexibel ändern können muss, um den spielern diverse Events bereitzustellen.

 

Sprich eine erhöhte DropRate etc... und das will ich dynamisch machen ohne immer neue Updates hochladen zu müssen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wenn die Datenbank bei einem Webhoster dabei ist wirst du nicht direkt zugreifen können. Überlicherweise lassen die nämlich Zugriff nur vom Webserver des Hosters zu.

D.h. du müßtest dir also beispielse mit php eine Webschnittstelle (Webservice) schreiben, welcher auf den DB zugreift und die Daten zurückliefert.

 

Hier im Forum gab es dazu auch schon sowas wie ein Tutorial, soweit ich mich erinnere.

 

 

Nachtrag

 

Folgendes sollte dir weiterhelfen:

http://forum.unity-community.de/topic/5657-howto-php-keygenerator-inkl-abfrage-in-unity/

http://www.3dan.de/tutorial-unity3d-slim-framework-1/

Link zu diesem Kommentar
Auf anderen Seiten teilen

fakt ist ich hab in meiner app ein paar variablen die ich flexibel ändern können muss, um den spielern diverse Events bereitzustellen.

 

Sprich eine erhöhte DropRate etc... und das will ich dynamisch machen ohne immer neue Updates hochladen zu müssen.

 

Die Frage ist, ob du da nicht besser fährst, wenn du die Konfiguration einfach als Datei auf den Server legst. Entweder super-simpel als einfache Textdatei (Vorteil: trivialer Parser, Nachteil: sehr unflexibel), oder als XML-Datei (Vorteil: sehr flexibel, Nachteil: entweder du musst die entsprechenden DLLs mitladen oder dir einen Lightweight-XML-Parser besorgen bzw. selbst implementieren ... ist normalerweise beides kein Ding, aber für manche Sachen ist XML einfach Overkill).

 

Vorteil der Datei-Lösung: Du kannst die Datei simpel im Editor bearbeiten, also insgesamt viel unkomplizierteres Handling. Die Datei liefert einfach der Webserver aus, den hast du eh schon. Anderenfalls brauchst du eben Datenbank, PHP oder andere Schnittstelle, damit der Webserver mit der Datenbank sprechen kann, und dann liefert der Webserver am Ende etwas aus, was letztlich nicht anders aussieht, als deine Datei ;-)

 

Eine Datenbank würde ich nur einsetzen, wenn ich entweder recht komplexe relationale Daten habe (also Daten, die ich auf mehrere voneinander abhängige Tabellen verteilen möchte oder bei denen ich "interessante" Abfragen brauche), oder die Daten sehr dynamisch ändern möchte (z.B. Highscores oder User-Verwaltung). Solange die Daten simpel sind, und nur du sie änderst, würde ich eher eine Datei verwenden (selbst wenn du verschiedene Konfigurationen haben möchtest, z.B. Testsystem, Produktiv usw., könntest du einfach mehrere Dateien, und der Client wählt, welche er nimmt).

Link zu diesem Kommentar
Auf anderen Seiten teilen

alles klar, also angenommen ich mach das mit einer txt. datei. dann erstelle ich einfach eine und packe dort meine Zahl rein angenommen "5" und diese lade ich dann auf meinen webserver per ftp hoch. wie sage ich nun in meinem c# script das er diese zahl nehmen soll? also aus txt. ein und auslesen bekomm ich hin. das geht ja mit system.IO aber wie gebe ich den pfad zu meinem webserver an?

 

und wieso ist eine txt datei unflexibel? die kann ich doch immer nach belieben ändern?!

Link zu diesem Kommentar
Auf anderen Seiten teilen

und wieso ist eine txt datei unflexibel? die kann ich doch immer nach belieben ändern?!

Klar kannst du die immer ändern, aber das Programm, das die Textdatei nutzt, muss genau wissen, wie du die Daten ablegst. Wenn in der Textdatei also "1, 2, 3, 4" steht, muss das Programm eben wissen, dass die erste Zahl die Droprate ist, die zweite ist ein Timer, die dritte die Playerspeed und die vierte die Anzahl der maximalen Spieler. In XML spielt das keine Rolle.

 

<settings>
<playerspeed>3</playerspeed>
<maxnumberofplayers>4</maxnumberofplayers>
<droprate>1</droprate>
<timer>2</timer>
</settings>

 

Außerdem kannst du in XML neue Features auch dynamisch einführen:

<settings>
<playerspeed>3</playerspeed>
<maxnumberofplayers>4</maxnumberofplayers>
<droprate>1</droprate>
<timer>2</timer>
<items>
  <item img="Beil.jpg" damage="4">Beil</item>
  <item img="Messer.jpg" damage="2">Messer</item>
  <item img="Knüppel.jpg" damage="1">Knüppel</item>
</items>
</settings>

Natürlich muss das Programm darauf ausgelegt sein, das zu verarbeiten. Mit einer Textdatei geht das schon auch, aber nur mit einer sehr starren Struktur, und bei jeder Änderung musst du deinen Parser anpassen.

 

Ich würde generell immer XML empfehlen, weil da die Dokumentation auch schon mit eingebaut ist. Mit XDocument ist der Zugriff unter Unity eigentlich kein Problem. In ein paar Monaten weißt du nicht mehr, welche Zahl in der Textdatei für was steht. In der XML-Datei kann dir das nicht passieren...

Link zu diesem Kommentar
Auf anderen Seiten teilen

alles klar, also angenommen ich mach das mit einer txt. datei. dann erstelle ich einfach eine und packe dort meine Zahl rein angenommen "5" und diese lade ich dann auf meinen webserver per ftp hoch. wie sage ich nun in meinem c# script das er diese zahl nehmen soll? also aus txt. ein und auslesen bekomm ich hin. das geht ja mit system.IO aber wie gebe ich den pfad zu meinem webserver an?

 

 

public string url = "http://images.earthcam.com/ec_metros/ourcams/fridays.jpg";

IEnumerator Start() {
   WWW www = new WWW(url);
   yield return www;
   renderer.material.mainTexture = www.texture;
}

 

Quelle: Scripting API: WWW ... statt fridays.jpg hast du dann halt deine Text-Datei (und natürlich auch deinen Webserver und Pfad auf dem Webserver). Zum Testen würde ich die Datei mit dem entsprechenden Pfad immer erstmal im Web-Browser aufrufen. Da müsste sie dann korrekt angezeigt werden. Wenn das funktioniert, würde ich's im Script versuchen.

 

 

und wieso ist eine txt datei unflexibel? die kann ich doch immer nach belieben ändern?!

 

Was Hrungdak gesagt hat. Wobei du natürlich durchaus auch eine Key-Value-Liste als Text-Datei speichern kannst, z.B.:

 

playerSpeed=3
maxNumberOfPlayers=4
dropRate=1
timer=2

 

So eine Liste kannst du auch relativ trivial in ein Dictionary<string,int> oder etwas allgemeiner Dictionary<string,string> parsen. Dabei hilft String.Split(...) und Int32.Parse(...). Wenn dann neue Eigenschaften dazu kommen, lesen alte Versionen deines Spiels diese halt nicht aus - das stört aber nicht. Insofern bist du da mit minimalem Parsing-Aufwand schon recht flexibel.

 

Flexibler ist XML aber, wenn du nicht einfach nur eine Key-Value-Liste brauchst, sondern hierarchische Datenstrukturen. In Hrungdaks Beispiel alles, was unter <items> steht. So etwas lässt sich theoretisch durchaus auch in eine simple Textdatei serialisieren - da hört der Spaß dann aber auf ;-)

 

XDocument ist super - aber wenn du einen möglichst kleinen Build möchtest (und unter WebGL wenn du eine möglichst kurze Build-Zeit haben möchtest), muss dir halt bewusst sein, dass dazu die DLL System.Xml.Linq.dll benötigt wird (Unity fügt die normalerweise automatisch hinzu, der Build wird dadurch aber größer).

 

Wenn du XDocument in einem Web Player verwenden möchtest, geht das sogar offenbar nur, wenn du die DLL explizit dem Projekt hinzufügst. Leerer Web Player mit Verwendung von XDocument:

 

Level 0 'Assets/TestScene.unity' uses 444.9 KB compressed / 2.8 MB uncompressed.
Included DLLs 1.0 mb  60.4% 

 

Gleicher Web Player ohne Verwendung von XDocument:

 

Level 0 'Assets/TestScene.unity' uses 139.8 KB compressed / 1.6 MB uncompressed.
Included DLLs 0.0 kb  0.0% 

Link zu diesem Kommentar
Auf anderen Seiten teilen

okey, ja die txt. braucht im Moment nur eine Zahl. das heißt das vllt ne txt. angebrachter ist da ich ja nicht so viele werte habe!

wenn ich das mit einer xml datei mache? füge ich die dann genauso wie die txt datei hinzu? also auch über:

 

public string url = "http://images.earthcam.com/ec_metros/ourcams/fridays.jpg";

 

IEnumerator Start() {

WWW www = new WWW(url);

yield return www;

renderer.material.mainTexture = www.texture;

}

 

Ansonsten danke schon mal für die ganzen Tipps!!!

Link zu diesem Kommentar
Auf anderen Seiten teilen

wenn ich das mit einer xml datei mache?

 

Genau ... wobei in dem Beispiel natürlich eine Textur geladen wird. Das ist ein wenig anders.

 

Statt www.texture würdest du www.text verwenden. Wenn du einfach nur eine Zahl in der Textdatei hast, geht wahrscheinlich sogar Int32.Parse(www.text.Trim()). Das Trim() entfernt Leerzeichen und Zeilenumbrüche, die dir ansonsten ggf. das Parsing durcheinander bringen.

 

Bei XML müsstest du www.text dann in den XML-Parser werfen und dann über das DOM bzw. eben XDocument deine Werte greifen. Für eine Zahl ist das völlig Overkill, wobei XDocument eine wirklich schöne API ist. Da würdest du dann XDocument.Parse(www.text) verwenden.

Link zu diesem Kommentar
Auf anderen Seiten teilen

alles klar danke, also wenn du sagst es ist Overkill dann empfiehlst du mir schon eher die simple txt datei oder?

 

Yo, für das, was du im Moment machst halte ich eine einfache Text-Datei für die geeignetere Lösung. Wenn du mehrere Werte brauchst, würde ich eine Key-Value-Textdatei machen (siehe oben). Wenn es komplizierter wird, oder du die Daten strukturieren möchtest, würde ich auf XML gehen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hab das jetzt so gelöst.

 

string ok;

void Awake()
{
	WebRequest request = WebRequest.Create("Meine URL");
	WebResponse response = request.GetResponse();
	StreamReader reader = new StreamReader(response.GetResponseStream());
	ok = reader.ReadToEnd();
}

 

Ist das so auch okey oder sind da irg. welche fehler? also Funktionieren tut es^^ nur da ich noch anfänger bin weiß ich nie ob das auch so legitimer code ist.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Funktioniert es auch im Build für die von dir gewählte Zielplattform (Standalone, Web Player, Mobile)?

 

Ich glaube, dass WebRequest nicht bei allen Plattformen unterstützt wird, d.h. das könnte ein Problem werden.

 

Eine andere Sache, die da für mich heikel aussieht: request.GetResponse() ist "blocking", d.h. der Main Thread wird dann wahrscheinlich beim Start relativ lange blockiert, was zumindest unschön ist.

 

Ich würde es lieber in einer Coroutine machen, mit der WWW-Klasse von Unity, wie in dem Beispiel weiter oben. Damit solltest du auf der sicheren Seite sein.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...