AniProGuy2 Geschrieben 4. Juni 2017 Melden Share Geschrieben 4. Juni 2017 Hallo liebe Community, Ich bin gerade dabei, meinem Spiel eine eigene "Settings" funktion zu geben, also einfach eine gewisse personale Einstellbarkeit. Die dazugehörigen Werte speichere ich in einer hastable (und später dann in einer .txt), was auch super funktioniert. Allerdings ist es nun so, dass ich diese Hashtable gern auslesen würde und einige Werte dort als Strings gespeichert werden. Ein bestes Beispiel ist die Einstellung, ob Chatlogs in Spielelobbies gespeichert werden sollen oder nicht. Der entsprechende Wert ist ein String und kommt aus einem Dropdown-Menü. Diesen speichere ich dann in der Hashtable. Wenn ich ihn nun auslese und zurück zu einem String konvertiere, kann ich diesen aber nicht abfragen. Es kommt zwar kein Error, aber die Abfrage kann niemals einen postiven Wert erhalten, also true werden. Ich versteh nicht so ganz warum, aber es schonmal kein Fehler in der Abfrage, denn der Wert wird richtig abgefragt. Wenn ich allerdings eine Integer abspeichere, sie aus der Hashtable zu einem String konvertiere und dann zu einer integer, kann ich sie abfragen. Ich verstehe das nicht so ganz, da ich auch erst seit kurzem mit Hashtables arbeite. Ich würde mich sehr freuen, wenn mir hier jemand weiterhelfen und es mir ggF. auch gleich richtig erklären könnte ^^ MfG, AniProGuy2 Mein Code: (die Console gibt mir nicht die "1" aus, auch wenn der Wert in der Hashtable eigentlich der Richtige ist) if (settings["SaveLobbyChatLog"].ToString() == "Don't save") print (1); Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
systemerror Geschrieben 14. Juni 2017 Melden Share Geschrieben 14. Juni 2017 möglicherweise irre ich mich auch aber vielleicht liegt es an dem String den Du vergleichst, da ist ein ' drin und das must Du vielleicht mit \ entwerten? also "Don\'t save" ?? Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 14. Juni 2017 Melden Share Geschrieben 14. Juni 2017 Nö, nur die doppelten Anführungsstriche müssten. Ein Apostroph ist völlig okay. Was die eigentliche Frage angeht... warum konvertierst du da überhaupt hin und her? Schreib doch einfach strings in dein Dictionary, dann kommen da auch Strings wieder raus. Davon abgesehen kannst du den rauskommenden String ja mal ansehen: print(settings["SaveLobbyChatLog"]); Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
AniProGuy2 Geschrieben 6. Juli 2017 Autor Melden Share Geschrieben 6. Juli 2017 Ich antworte vielleicht etwas spät, aber genau das mache ich gerade ^^ Ich lese Strings aus einem Dictionary aus und vergleiche sie, was aber genauso wenig funktioniert... Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Zer0Cool Geschrieben 6. Juli 2017 Melden Share Geschrieben 6. Juli 2017 Schau halt mal was im String drin steht: "Don't save" oder "Don`t save" oder "Don´t save" Notfalls mal die ASCII-Codes des Strings ausgeben lassen. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Hrungdak Geschrieben 7. Juli 2017 Melden Share Geschrieben 7. Juli 2017 Direkte Verwendung von Strings bringt oft Probleme mit. Ich definiere meistens eine Klasse, die nur String-Konstanten enthält: public class Constants { public const string SaveLobbyChatLog = "SaveLobbyChatLog"; public const string SaveWindowPosition = "SaveWindowPosition"; // ... } Dann kannst du deine Hashtable mit dieser Konstante abfragen: if (settings[Constants.SaveLobbyChatLog].ToString() == "Don't save") print (1); Vorteil: du kannst dich nicht mehr vertippen. Das soll ja offensichtlich ein bool-Wert werden. Warum speicherst du nicht statt des fehleranfälligen "Don't save" ein "true" oder "false"? Der Wert "SaveLobbyChatLog" sagt ja schon aus, was der Wert dann bedeutet. Und nimmst das gleich noch in die Konstanten mit auf? public class Constants { public const string SaveLobbyChatLog = "SaveLobbyChatLog"; public const string SaveWindowPosition = "SaveWindowPosition"; // ... public const string True = "true"; public const string False = "false"; } Das verändert die Abfrage auf if (settings[Constants.SaveLobbyChatLog].ToString() == Constants.False) print (1); Beim Setzen des Wertes verwendest du natürlich ebenfalls diese Konstanten: settings.Add(Constants.SaveLobbyChatLog, Constants.True); Schreibfehler ausgeschlossen. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
AniProGuy2 Geschrieben 8. Juli 2017 Autor Melden Share Geschrieben 8. Juli 2017 @ Zer0Cool Die Strings sind definitiv richtig, weil ich sie aus einer .txt in die Hashtable reinlade und dann auch direkt das abfrage, was in der .txt steht. Ich kann gar keinen Schreibfehler haben, aber natürlich habe ich das immer wieder geprüft. @ Hrungdak Das ist eine ziemlich gute Idee! Ich habe zwar für mein Problem mittlerweile eine andere Lösung gefunden, aber ich werde mir das defintiv für die nächsten Male merken. Danke! Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Mark Geschrieben 10. Juli 2017 Melden Share Geschrieben 10. Juli 2017 Am 8.7.2017 um 20:33 schrieb AniProGuy2: weil ich sie aus einer .txt in die Hashtable reinlade Kann es sein dass deine tct Datei einfach nur durch Newlines die einzelnen Einträge voneinander trennt? Wenn du die einzelnen Elemente durch string.Split voneinander in ein Array aufspaltest dann besteht die Möglichkeit dass deine Strings ein abschließendes \r enthalten. Unter Windows kommt diese Form ganz oft vor. Zitat Hallo\r\nWelt\r\nNeue Zeile\r\nTest Zitat Hallo Welt Neue Zeile Test Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
AniProGuy2 Geschrieben 10. Juli 2017 Autor Melden Share Geschrieben 10. Juli 2017 Wenn ich es via "print" in die Konsole schreibe, dann ist dort kein \r dabei. Die Theorie klingt zwar logisch, aber ich gehe nicht davon aus, dass das bei mir der Fall ist. . Hier aber mal das Script, mir dem ich die .txt in die Hashtable (bzw. mittlerweile Dictionary) lade: StreamReader sr = new StreamReader ("Settings/Settings.txt"); string[] import = sr.ReadToEnd ().Split ('\n'); sr.Close (); string key; string value; for (int i = 0; i <= import.Length - 1; i++) { key = ""; value = ""; int index = import [i].IndexOf (":"); for (int j = 0; j <= import [i].Length - 1; j++) { if (j < index) key += import [i] [j]; else if (j > index) value += import [i] [j]; } settings.Add (key, value); } Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Mark Geschrieben 10. Juli 2017 Melden Share Geschrieben 10. Juli 2017 \r ist auch kein Symbol was ausgegeben werden kann https://stackoverflow.com/questions/1279779/what-is-the-difference-between-r-and-n Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Zer0Cool Geschrieben 10. Juli 2017 Melden Share Geschrieben 10. Juli 2017 Lass dir mal die Ascii-Codes der beiden Strings ausgeben (damit siehst du auch versteckte White-Chars). Ich habe jetzt aber mal Unicode genommen, da hat man noch eine bessere "Auflösung" (16 bit) als bei ASCII (7bit). using UnityEngine; using System.Collections; using System.Text; public class TestPrint : MonoBehaviour { void Start() { string s1 = settings["SaveLobbyChatLog"].ToString(); OutUnicode(s1); string s2 = "Don't save"; OutUnicode(s2); } void OutUnicode(string s) { byte[] ASCIIValues = Encoding.Unicode.GetBytes(s); string line = ""; foreach (byte b in ASCIIValues) { line += " " + b; } Debug.Log(line); } } Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
AniProGuy2 Geschrieben 13. Juli 2017 Autor Melden Share Geschrieben 13. Juli 2017 @Mark Achso, das wusste ich gar nicht >.< Danke!@Zer0Cool Tatsache, bei den Settings hängt am Ende noch "13 0 13 0 13 0" dran >.< Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Zer0Cool Geschrieben 13. Juli 2017 Melden Share Geschrieben 13. Juli 2017 Das sind dann 3 Carriage Return (000D) also "\r\r\r". Wenn du 3 Zeichen hinten abschneidest sollte es passen, oder besser eine Routine verwenden die alle White Chars aus einem String entfernt (wenn man alle Zeichen < 32 entfernt hat mal glaube ich schon alle erwischt). Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
AniProGuy2 Geschrieben 14. Juli 2017 Autor Melden Share Geschrieben 14. Juli 2017 Ok danke, werde ich machen ^^ Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Recommended Posts
Archiviert
Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.