Kojote Geschrieben 18. September 2017 Melden Share Geschrieben 18. September 2017 Grüße! Ich bin nun so weit fertig mit meiner App und nun staune ich nicht schlecht, dass sie gepackt per APK nicht funktioniert. ^^" Eine Vermutung hatte ich gleich und hat sich bestätigt, als ich das Spiel in eine EXE kompiliert habe. Er findet mehrere XML Dateien nicht, diese Dateien nutze ich, um Spielerdaten, Spieldaten und anderes zu speichern. Zu finden bei mir unter: Assets/Resources Nun gibt mir der Debuger in der Windows Version aus: IsolatedStorageException: Could not find a part of the path "C:\Users\USER\Documents\Spiel\Developer Build\Assets\Resources\spielerdaten.xml" Ja, ist klar das er nichts findet, da der Pfad nur bis "Developer Build" existiert. "Assets" und der Rest ist nicht zu finden, genau so wie meine XML Dateien, dieses kann ich in keinem Ordner finden. Spielderdaten lade ich so: // Spielerdaten aus der XML Laden xmlDocSpielerdaten = new XmlDocument(); pfadDirectory = Directory.GetCurrentDirectory(); pfadSpielerDaten = pfadDirectory + "\\Assets\\Resources\\spielerdaten.xml"; xmlDocSpielerdaten.Load(pfadSpielerDaten); transformListGespeichertesSpielDaten = xmlDocSpielerdaten.GetElementsByTagName("spielerdaten"); foreach (XmlNode transformInfo in transformListGespeichertesSpielDaten) { XmlNodeList transformcontent = transformInfo.ChildNodes; foreach (XmlNode transformItens in transformcontent) { if (transformItens.Name == "Einstellung_Zahl_Sprache") { einstellungZahlSprache = int.Parse(transformItens.InnerText); } if (transformItens.Name == "Einstellung_Zahl_Spielzeit") { einstellungZahlSpielzeit = int.Parse(transformItens.InnerText); } if (transformItens.Name == "Einstellung_Zahl_Statistik") { einstellungZahlStatistik = int.Parse(transformItens.InnerText); } if (transformItens.Name == "Einstellung_Zahl_Wachbleiben") { einstellungZahlWachbleiben = int.Parse(transformItens.InnerText); } if (transformItens.Name == "Einstellung_Zahl_Linkshaender_Modus") { einstellungZahlLinkshaenderModus = int.Parse(transformItens.InnerText); } if (transformItens.Name == "Einstellung_Zahl_Hilfe") { einstellungZahlQueryHilfe = int.Parse(transformItens.InnerText); } if (transformItens.Name == "Einstellung_Zahl_Musik_ProzentZahl") { einstellungZahlMusikProzentZahl = int.Parse(transformItens.InnerText); } if (transformItens.Name == "Einstellung_Zahl_SFX_Prozent_Zahl") { einstellungZahlSFXProzentZahl = int.Parse(transformItens.InnerText); } if (transformItens.Name == "Einstellung_Zahl_Musik_Track_Nummer") { einstellungZahlMusikTrackNummer = int.Parse(transformItens.InnerText); } } } WIe gesagt im Editor alles kein Problem, klappt wunderbar. Nur nach dem kompilieren funktioniert das Laden der Daten nicht. Knackpunkt wird wohl das hier sein: pfadSpielerDaten = pfadDirectory + "\\Assets\\Resources\\query_spielerdaten.xml"; Frage wäre, wie sollte ich sonst den Dateipfad finden bzw. wo speichert Unity meine XML Dateien nach dem kompilieren? Grüße und schon einmal Danke von Kojote Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Djeurissen Geschrieben 18. September 2017 Melden Share Geschrieben 18. September 2017 Soweit ich das richtig verstehe suchst du https://docs.unity3d.com/ScriptReference/Resources.Load.html Diese Methode lädt Daten zur Laufzeit aus dem Resourcen Ordner und sollte dementsprechend auch deine XML Datei finden. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Kojote Geschrieben 18. September 2017 Autor Melden Share Geschrieben 18. September 2017 Habe es gerade ausprobiert und scheint nun so zu funktionieren: xmlDocSpielerdaten = new XmlDocument(); textAssetSpielerdaten = (TextAsset)Resources.Load("spielerdaten"); xmlDocSpielerdaten.LoadXml(textAssetSpielerdaten.text); Jedoch, wie speichere ich den Spaß wieder? Ich finde nämlich keine Methode dafür. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Djeurissen Geschrieben 18. September 2017 Melden Share Geschrieben 18. September 2017 Das ist nicht möglich: https://forum.unity.com/threads/update-the-resources-folder-at-runtime.155173/ Dafür musst du wieder deine alte Methode nutzen, nur das du die Daten eben nicht mehr im RessourcenOrdner suchst Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Kojote Geschrieben 19. September 2017 Autor Melden Share Geschrieben 19. September 2017 Wo sind sie denn dann zu finden, so richtig blicke ich da gerade nicht durch. Wie ich gerade lese, gibt es den Resourcen Ordner nach den kompilieren nicht mehr. Viele speichern in neue Daten, jedoch will ich doch auch Daten aktualisieren die sich im Resourcen Ordner befinden. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Torigas Geschrieben 19. September 2017 Melden Share Geschrieben 19. September 2017 Ganz oft werden die lokalen Nutzerordner verwendet um Speicherstände und Einstellungen abzulegen: https://docs.unity3d.com/ScriptReference/Application-persistentDataPath.html Du könntest also deine initialen Einstellungen aus deinem Resourcesordner laden und danach die neue, angepasste Version im Userverzeichnis. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Kojote Geschrieben 19. September 2017 Autor Melden Share Geschrieben 19. September 2017 Also du meinst, dass was bei mir im Resourcen Ordner ist, in diesen Ordner schreiben und danach nicht mehr die Daten aus dem Resourcen Ordner Laden, sondern aus dem neuen Ordner? Problem ist eben bei mir, ich habe in meinem Spiel mehrere hundert Variablen (ist ein Knobelspiel), die ich in einer XML Speichere und dann je nach dem was ich brauche bei Spielbeginn auslese. Wenn das Spiel geschafft ist, gibt es in der XMl ein extra Element, wo ich hinterleg, ob das Spiel schon einmal gespielt wurde. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Djeurissen Geschrieben 19. September 2017 Melden Share Geschrieben 19. September 2017 Der Resourcenordner wird wie alles andere kompiliert und mit den Unity Daten ausgeliefert. Was genau dabei kompilieren heisst kann ich dir nicht sagen. Aufjedenfall sind diese Daten nicht mehr veränderbar, du kannst zwar Daten aus dem Ressourcenordner laden aber nicht mehr ändern. Was Torigas dir nun gezeigt hat ist die Variable Application.persistentDataPath. Dieser Pfad zeigt auf irgendeinen Ordner wo du sicher deine Daten ablegen kannst.D.h nimm diesen Pfad und leg dort deine XML Datei an. Diese kannst du dann auch ändern. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Kojote Geschrieben 19. September 2017 Autor Melden Share Geschrieben 19. September 2017 Ja, stimme, hab nur keine Ahnung, wie ich eine XML Erstellen soll. Bin nun soweit: public void Start() { string pfad = Directory.GetCurrentDirectory(); string dateiPfad = pfad + "/" + "test.xml"; XmlDocument xmlDoc = new XmlDocument(); XmlWriterSettings settings = new XmlWriterSettings { OmitXmlDeclaration = true, Indent = true }; using (XmlWriter writer = XmlWriter.Create(dateiPfad, settings)) { XmlElement elmRoot = xmlDoc.DocumentElement; XmlElement elmNew = xmlDoc.CreateElement("Test"); XmlElement zahl = xmlDoc.CreateElement("zahl"); zahl.InnerText = "1"; elmNew.AppendChild(zahl); elmRoot.AppendChild(elmNew); xmlDoc.Save(dateiPfad); writer.Close(); }; } Die Datei wrid erstellt, jedoch leider wird nichts eingetragen. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Djeurissen Geschrieben 19. September 2017 Melden Share Geschrieben 19. September 2017 2. Dinge: 1. Das ist ja ein neues Thema dafür sollte man am besten auch einen neuen Thread aufmachen. 2. Dein Code scheint ziemlich durcheinander zu sein, du versuchst gerade mehrere Lösungsansätze führst aber keinen zuende. Evtl. solltest du den Code vorher nochmal aufräumen bevor du den hier postest. Der XMLWriter erlaubt dir XML Dokumente zu schreiben. Das Problem dabei ist das es sehr umständlich ist das richtig hinzubekommen: https://www.dotnetperls.com/xmlwriter Du musst genau drauf achten wo du ein Element öffnest, schließt etc. Mit dem XMLDocument kannst du XML darstellen indem du Klassen wie XmlElement etc. nutzt. Vorteil dabei du musst nicht darauf achten wann du etwas schließt. Wenn du nun xmlDoc.Save aufrufst nutzt dieses warscheinlich den XMLWriter um die Daten zu speichern. Das Problem bei dir ist allerdings das du dem XMLDocument niemals die Elemente gegeben hast. Du hast zwar XmlElement's angelegt aber halt nicht zum Dokument hinzugefügt. https://msdn.microsoft.com/de-de/library/dw229a22(v=vs.110).aspx Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Kojote Geschrieben 19. September 2017 Autor Melden Share Geschrieben 19. September 2017 Da war jemand schneller.^^ Ja, ich habs gemerkt, XMLWriter schafft das zwar, ist aber nen ziemlicher Aufwand. Den Code hab ich nun noch einmal komplett runter geschmissen, hast recht, ich hab mich in so viele Lösiungsansätze eingelesen, dass nur Mist raus gekommen ist. Habe ihn nun noch einmal neu aufgebaut, nun siehts alles so aus und scheint zu funktionieren: [Serializable] public class Spielderdaten { public int einstellungZahlHilfe; public int einstellungZahlSprache; public int einstellungZahlSpielzeit; public int einstellungZahlStatistik; public int einstellungZahlWachbleiben; public int einstellungZahlLinkshaenderModus; public int einstellungZahlMusikProzentZahl; public int einstellungZahlSFXProzentZahl; public int einstellungZahlMusikTrackNummer; } private void Speichern() { BinaryFormatter binFormatter = new BinaryFormatter(); FileStream file; if (Application.isMobilePlatform == true) { file = File.Create(Application.persistentDataPath + "/db/spielerdaten.dat"); } else { file = File.Create(Application.dataPath + "/spielerdaten.dat"); } Spielderdaten data = new Spielderdaten(); data.einstellungZahlHilfe = einstellungZahlQueryHilfe; data.einstellungZahlSprache = einstellungZahlQueryHilfe; data.einstellungZahlSpielzeit = einstellungZahlSpielzeit; data.einstellungZahlStatistik = einstellungZahlStatistik; data.einstellungZahlWachbleiben = einstellungZahlWachbleiben; data.einstellungZahlLinkshaenderModus = einstellungZahlLinkshaenderModus; data.einstellungZahlMusikProzentZahl = einstellungZahlMusikProzentZahl; data.einstellungZahlSFXProzentZahl = einstellungZahlSFXProzentZahl; data.einstellungZahlMusikTrackNummer = einstellungZahlMusikTrackNummer; binFormatter.Serialize(file, data); file.Close(); } public void Laden() { if (Application.isMobilePlatform == true) { if (File.Exists(Application.persistentDataPath + "/db/query_spielerdaten.dat")) { BinaryFormatter binaryFormatterSpielerdaten = new BinaryFormatter(); FileStream fileStreamSpielerDaten = File.Open(Application.persistentDataPath + "/db/spielerdaten.dat", FileMode.Open); Spielderdaten data = (Spielderdaten)binaryFormatterSpielerdaten.Deserialize(fileStreamSpielerDaten); data.einstellungZahlHilfe = einstellungZahlHilfe; data.einstellungZahlSprache = einstellungZahlSprache; data.einstellungZahlSpielzeit = einstellungZahlSpielzeit; data.einstellungZahlStatistik = einstellungZahlStatistik; data.einstellungZahlWachbleiben = einstellungZahlWachbleiben; data.einstellungZahlLinkshaenderModus = einstellungZahlLinkshaenderModus; data.einstellungZahlMusikProzentZahl = einstellungZahlMusikProzentZahl; data.einstellungZahlSFXProzentZahl = einstellungZahlSFXProzentZahl; data.einstellungZahlMusikTrackNummer = einstellungZahlMusikTrackNummer; fileStreamSpielerDaten.Close(); } else { SpieleMenueSpeichern(); } } else { if (File.Exists(Application.dataPath + "/query_spielerdaten.dat")) { BinaryFormatter binaryFormatterSpielerdaten = new BinaryFormatter(); FileStream fileStreamSpielerDaten = File.Open(Application.dataPath + "/pielerdaten.dat", FileMode.Open); Spielderdaten data = (Spielderdaten)binaryFormatterSpielerdaten.Deserialize(fileStreamSpielerDaten); data.einstellungZahlHilfe = einstellungZahlHilfe; data.einstellungZahlSprache = einstellungZahlSprache; data.einstellungZahlSpielzeit = einstellungZahlSpielzeit; data.einstellungZahlStatistik = einstellungZahlStatistik; data.einstellungZahlWachbleiben = einstellungZahlWachbleiben; data.einstellungZahlLinkshaenderModus = einstellungZahlLinkshaenderModus; data.einstellungZahlMusikProzentZahl = einstellungZahlMusikProzentZahl; data.einstellungZahlSFXProzentZahl = einstellungZahlSFXProzentZahl; data.einstellungZahlMusikTrackNummer = einstellungZahlMusikTrackNummer; fileStreamSpielerDaten.Close(); } else { SpieleMenueSpeichern(); } } } 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.