2016-04-27 6 views
0

Ich möchte meine Daten speichern, wenn die aktuelle laufende Szene entladen wurde. Zu diesem Zweck habe ich geschrieben folgender Code:MissingReferenceException bei Szenenentladezeit

void OnDisable() 
{ 
    BackUpPuzzleData(); 
} 

public void BackUpPuzzleData() 
{ 
    if (DataStorage.RetrievePuzzleStatus (difficultyLevel, puzzleId) == Constants.PUZZLE_NOT_OPENED 
     && DataStorage.RetrievePuzzleStatus (difficultyLevel, puzzleId) != Constants.PUZZLE_COMPLETED) 
     DataStorage.StorePuzzleStatus (difficultyLevel, puzzleId, Constants.PUZZLE_RUNNING); 

    if (DataStorage.RetrievePuzzleStatus (difficultyLevel, puzzleId) == Constants.PUZZLE_RUNNING) 
     StorePuzzleData(); 
} 


private void StorePuzzleData() 
{ 
    DataStorage.StorePuzzleTimePassed (difficultyLevel, puzzleId, GameController.gamePlayTime); 

    foreach (Transform cell in gridTransform) { 
     CellInformation cellInfo = cell.GetComponent<CellInformation>(); 
     if (cellInfo != null) { 
      CellStorage.StorePuzzleCellNumber (difficultyLevel, puzzleId, cellInfo.RowIndex, cellInfo.ColIndex, cellInfo.number); 
      CellStorage.StorePuzzleCellColor (difficultyLevel, puzzleId, cellInfo.RowIndex, cellInfo.ColIndex, cellInfo.CellColor); 
      CellStorage.StorePuzzleCellDisplayColor (difficultyLevel, puzzleId, cellInfo.RowIndex, cellInfo.ColIndex, cellInfo.CellDisplayColor); 
     } 
    } 
} 

Aber wenn EinschSperre Verfahren zu diesem Zeitpunkt aufgerufen wird mir Konsole gibt folgende Fehlermeldung:

enter image description here

Ich habe bereits gesetzt Ausführungsreihenfolge von Scrip in Projekt Einstellungen warum dann bekomme ich diese Art von Fehler?

ZIEL: Grundsätzlich möchte ich aktuelle Spieldaten speichern, so wenn der Spieler zurück Spiel kann er wieder starten, von dem er das Spiel verlassen.

+0

Warum genau diese Sequenz? Können Sie versuchen, Daten zuerst zu speichern und die Szene nach dem Speichern zu löschen? –

+0

Gibt es ein Ereignis, das Sie vor OnDisable verarbeiten können? Es scheint, dass Sie den Zugriff auf die Objekte verloren haben, die Sie zu diesem Zeitpunkt abfragen müssen. – ManoDestra

+0

Wie würdest du dich entscheiden, wenn die Szene entladen wird? z. B. ein Zurück-Klick? – NeverHopeless

Antwort

0

Einige Zeit mit diesem Problem verstreichen, jetzt kann ich dieses Problem herausfinden. Ich weiß nicht, wie viel Lösung richtig war, aber jetzt zumindest für mich funktioniert.

Hier diskutiere ich das, weil einige Mitglieder einen Hinweis davon bekommen.

Zum Spiel Ladezeit, füllte ich eine Liste mit allen Zellen-Skript. Jede Zelle des Gitters hat ein Skript CellInformation. Also bereite ich eine Liste all dieser Zellen vor.

Zum Zeitpunkt der Deaktivierung des Spiels habe ich Wert von diesen Skripten abgerufen und in lokalen Speicher gespeichert. Ich kann auf Skripte zugreifen, aber nicht auf Objekte aus der Liste, weil sie bereits zerstört wurden.

void OnDisable() 
{ 
    StorePuzzleData(); 
} 

private void StorePuzzleData() 
{ 
    DataStorage.StorePuzzleTimePassed (difficultyLevel, puzzleId, GameController.gamePlayTime); 

    foreach (CellInformation cellInfo in cellInfoList) { 
     CellStorage.StorePuzzleCellNumber (difficultyLevel, puzzleId, cellInfo.RowIndex, cellInfo.ColIndex, cellInfo.number); 
     CellStorage.StorePuzzleCellColor (difficultyLevel, puzzleId, cellInfo.RowIndex, cellInfo.ColIndex, cellInfo.CellColor); 
     CellStorage.StorePuzzleCellDisplayColor (difficultyLevel, puzzleId, cellInfo.RowIndex, cellInfo.ColIndex, cellInfo.CellDisplayColor); 
     CellStorage.StorePuzzleCellGroupComplete (difficultyLevel, puzzleId, cellInfo.RowIndex, cellInfo.ColIndex, cellInfo.IsGroupComplete ? 1 : 0); 
    } 

} 

Ich hoffe, das einige Hinweise auf andere Programmierer geben.

+0

Was ist, wenn das Spiel abstürzt? Sie verlieren Ihre Spielinformationen ... – MalachiteBR

+0

Spielcode läuft so gut dann, wie es Unfall erzeugen kann !!! – Siddharth

+0

Es tut mir leid ... Ich will nicht unhöflich sein ... aber, wie alt bist du? Es ist so naiv zu glauben, dass das Spiel niemals abstürzen wird: D – MalachiteBR

1

Ich habe einen Vorschlag, anstatt zu speichern, wenn Szenen entladen werden, können Sie jedes Mal speichern, wenn der Spieler einen Zug macht. Auf diese Weise können Sie auch nach einem Spielabsturz vom letzten Zug zurückkommen.

Diese Szene entladen, wird automatisch auftreten oder wird der Benutzer irgendwelche Maßnahmen (wie das Klicken auf eine Schaltfläche)? Wenn es sich um ein Spielerereignis handelt, sollten Sie Ihren Sicherungscode auf diese Schaltfläche setzen, da das OnDisable-Verhalten nach der Zerstörung Ihrer Objekte aufgerufen wird, so dass Sie Ihre Daten nicht speichern können.

+0

Grundsätzlich arbeite ich am Sudoku-Spiel, so dass das Speichern von Daten pro Spielerbewegung meines Spiels nicht korrekt ist. – Siddharth

+0

Viele Spiele, viel komplexer als Sudoku, macht es so. Fallout Shelter zum Beispiel, wenn Sie einfach das Spiel durch Drücken der Home-Taste verlassen, wird es genau dort fortgesetzt, wo Sie waren. – MalachiteBR

+0

Wenn OnDisable zu arbeiten beginnt, dann habe ich diese Funktion auch ... – Siddharth