2017-02-01 5 views
0

Ich arbeite an einem Einsparsystem in Einheit mit C# -Code. Wie kann ich diese Art von Sparsystem erhalten?PlayerPrefs gleich GameObject

In meinem leeren GameObject habe ich ein Skript und hier ist es:

Counter.cs

public int counter; 

Und das ist alles auf meinem Counter.cs. Nun, wie kann ich es speichern und bekommen, wenn es in einem GameObject ist. Ich möchte nur den Counter in Counter.cs bekommen.

Kann ich es so machen.

SaveAndLoad.cs

public GameObject SaveCounter; 

public void Save(){ 
    PlayerPrefs.SetInt("Player Score", SaveCounter); 
} 

public void Load(){ 
    PlayerPrefs.GetInt("Player Score")); 
} 

Kann ich es so etwas tun?

+1

Sie sollten 'PlayerPrefs' nicht verwenden, um Spielfortschritte und ähnliches zu speichern. Aber wenn es das ist, was du willst, ja, du kannst es so machen. –

+0

Wie @ m.rogalski sagte. Es ist nicht "der Weg". Ich glaube, dass Unity empfiehlt, dafür ein skriptfähiges Objekt zu verwenden und das zu speichern. ScriptableObjects kann in Assets gespeichert werden :). Oder schreibe deine eigene benutzerdefinierte Gamesave-Datei. – Measuring

+0

@ m.rogalski so kann ich es so machen PlayerPrefs.SetInt ("Player Score", SaveCounter ()); PlayerPrefs.GetInt ("Player Score"); – TheGinxx009

Antwort

2

Um Ihre Frage zu

Sie sollten nicht STORE GAME STAAT RELATED SACHEN IM PLAYER PREFS

Stattdessen können Sie serialisierbares Objekt machen beantworten:

[Serializable] 
public class GameState 
{ 
    int m_Score; 

    public int Score 
    { 
     get { return m_Score; } 
     set { m_Score = value; } 
    } 
} 

Dann ein BinaryFormatter verwenden und einige Helfer Objekt, um diese Daten in eine Datei zu serialisieren:

public void StoreGameState(GameState state) 
{ 
    using (BinaryWriter writer = new BinaryWriter(File.OpenWrite("./gamestate.bin"))) 
    { 
     var formatter = new BinaryFormatter() 
     formatter.Serialize(state, writer); 
    } 
} 

public GameState RestoreGameState() 
{ 
    using (BinaryReader reader = new BinaryReader(File.OpenRead("./gamestate.bin"))) 
    { 
     var formatter = new BinaryFormatter() 
     return (GameState)formatter.Deserialize(reader); 
    } 
} 

Dann GameState zu Ihrem leeren GameObject hinzufügen:

public GameState CurrentProgress; 

Und lesen Sie, wenn Sie die beiden Methoden verwenden, um speichern oder laden möchte ich geschrieben habe: StoreGameState und RestoreGameState.

Aber wenn Sie wirklich in diese Art von Daten in PlayerPrefs speichern, dann können Sie noch tun:

public GameObject SaveCounter; 

public void Save(){ 
    PlayerPrefs.SetInt("Player Score", SaveCounter.GetComponentn<Counter>().counter); 
} 

public void Load(){ 
    SaveCounter.GetComponentn<Counter>().counter = PlayerPrefs.GetInt("Player Score")); 
} 

Was nicht von niemandem empfohlen.

+0

Warum ist es nicht empfehlenswert, Sir? – TheGinxx009

+1

@ TheGinxx009 1. 'PlayerPrefs' kann nur ein paar Typen (int, float, string) speichern. 2. Sie haben keine Kontrolle darüber, wo die Daten gespeichert werden. 3.Keine Kontrolle darüber, wie die Daten interpretiert werden (Sie müssen einen Wrapper dafür schreiben). 4. 'PlayerPrefs' ist für Spielerpräferenzen nicht Spielerfortschritt. Verwenden Sie 'PlayerPrefs', wenn Sie ein Lernprogrammfenster ausblenden möchten, nachdem der Benutzer es zum ersten Mal gesehen hat (z. B.). – Measuring

+0

@ TheGinxx009 Weil es keine persistente Datei ist. Es ist grundsätzlich anders für jede Plattform und für Windows verwendet es eine Registrierung, die nie eine gute Idee zu schreiben ist. –

Verwandte Themen