Jump to content
Unity Insider Forum

InvalidOperationException


Garzec

Recommended Posts

Hallo,

ich möchte Daten aus meiner JSON Datei lesen. Dafür habe ich eine Klasse, die diese Datei anspricht und die Daten hält.

private JSONFileInfo data;

private string databasePath;

private void Awake()
{
    databasePath = Application.streamingAssetsPath + "/save.json";
}

public JSONFileInfo GetData() // Aktuelle Daten weitergeben
{
    LoadData();
    return data;
}

private void LoadData() // Daten aus der JSON laden
{
    string jsonString = File.ReadAllText(databasePath);
    data = JsonUtility.FromJson<JSONFileInfo>(jsonString);
}

Diese Klasse wird von verschiedenen Klassen angesprochen. Die ansprechenden Klassen rufen die Datenbank Klasse in ihrem Awake Event auf. Beispiel:

protected Database db;

    private void Awake()
    {
        db = Globals.GetDatabase(); // Skript Referenz
        JSONFileInfo data = db.GetData();
        Level level = data.levels.Where(targetLevel => targetLevel.id == currentLevelId).First();
    }

Diesen Code muss ich ebenfalls in Awake aufrufen, da weitere Klassen in ihrem Start Event auf die in Awake gesetzten Daten warten. Ich bekomme folgende Fehlermeldung beim Starten des Spiels

Zitat

InvalidOperationException: Operation is not valid due to the current state of the object System.Linq.Enumerable.First[FileLevel] (IEnumerable`1 source) Level.InitPlace () (at Assets/Scripts/Map/Places/Level.cs:13) Place.Awake () (at Assets/Scripts/Map/Place.cs:29)

Zum Fehler habe ich jetzt nur Theorien parat:

- der Zugriff auf die Datenbank ist asynchron und funktioniert somit nicht in der synchronen Reihenfolge

- Die Datenbank baut sich in Awake auf und andere Skripte greifen in ihrem Awake bereits auf die Datenbank zu

Ich tippe mal auf Theorie Nummer 2. Kann ich die Awakes auf das Awake der Datenbank warten lassen? Vielleicht liegt der Fehler ja auch woanders ..

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wenn der Grund der 2. ist, dann brauchst du von der Datenbank eine Meldung, wann sie "Ready" ist.

Die anderen Skripte könnten nun in einer Coroutine warten bis die Datenbank ihr "Ready" ausgibt und erst dann Abfragen gegen die Datenbank starten.

Eine andere Möglichkeit ist die Ausführungsreihenfolge der Skripte in Unity zu setzen (da bin ich aber kein Freund von).

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ok, ich habe es grade herausgefunden.

1. Meine Objekte, die sich auch in Awake initialisieren, habe ich in "OnEnable" gepackt, dann liegen diese immer noch vor Start und die Datenbank kann sich in Awake aufbauen.

2. Der Fehler ist einfach nur ein Syntax Problem durch mein Verschulden gewesen, er hat über die Id 0 natürlich kein Level gefunden und das wollte mir der Fehler damit sagen..

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...