Jump to content
Unity Insider Forum

APK und Windows Export Daten fehlen


Kojote

Recommended Posts

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

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

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

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

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

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

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

Archiviert

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

×
×
  • Neu erstellen...