2017-12-07 1 views
2

Nun versuche ich meine Spielstatistiken mit dem System serialisierbar zu speichern, aber ich bin nicht in der Lage, es zu tun. Ich habe zwei Skripte namens "Stats" und einen anderen namens "SaveLoad" in den "Stats" i haben meine serializables und in der „SaveLoad“ ich habe meine Speichern und Laden Skript i folgte den Anweisungen hierIch kann meine Spielstatistik nicht serialisieren

https://gamedevelopment.tutsplus.com/tutorials/how-to-save-and-load-your-players-progress-in-unity--cms-20934

Aber da ich bin ein begginer mit diesem Zeug und meine seriazable Daten unterscheidet i Probleme habe beim Speichern es.

Meine „Statistik“

using UnityEngine; 
using System.Collections; 
[System.Serializable] 
public class Stats : MonoBehaviour { 

public static int coins = 0; 
public static int totalcoins = 0; 
public static int score = 0; 

public static int personalbest = 0; 
public static float UmbrellaSpeed = 0.1f; 
public static float currentumbdur = 500; 

public static int CarrotSpawnRateLVL = 1; 
public static float CarrotSpawnRate = 60f; 
public static int CarrotSpawnRateUpgradeCost = 15; 


public static int UmbrellaDurabilityLVL = 1; 
public static float UmbrellaDurability = 500; 
public static int UmbrellaDurabilityUpgradeCost = 30; 

public static int UmbrellaSizeLVL = 1; 
public static float UmbrellaSize = 0f; 
public static int UmbrellaSizeUpgradeCost = 25; 


public static int CarrotEffectLVL = 1; 
public static float CarrotEffect = 20; 
public static int CarrotEffectUpgradeCost = 25; 


public static int HealthRegenLVL = 1; 
public static float HealthRegenTime = 4f; 
public static int HealthRegenCost = 100; 


public static int BuyTreesCost = 250; 

public static int Tree1Bought = 0; 
public static float Tree1Size = 0; 
public static int Tree1SizeLVL = 1; 
public static int Tree1SizeUpgradeCost = 50; 

public static int Tree2Bought = 0; 
public static float Tree2Size = 0; 
public static int Tree2SizeLVL = 1; 
public static int Tree2SizeUpgradeCost = 50; 

public static int Tree3Bought = 0; 
public static float Tree3Size =0; 
public static int Tree3SizeLVL = 1; 
public static int Tree3SizeUpgradeCost = 50; 

// Use this for initialization 
void Start() { 
    InvokeRepeating ("AddCoins", 4.0f, 2.0f); 
    InvokeRepeating ("AddScore", 1.5f, 1.5f); 
} 

// Update is called once per frame 
void Update() { 
    if (score > personalbest) { 
     personalbest = score; 
    } 
    //Debug.Log (" " + coins); 
} 

void AddCoins(){  
    if (BunnyScript.BunnyAlive == true) { 
     coins += 1; 

    } 
} 

void AddScore(){ 
    if (BunnyScript.BunnyAlive == true) { 
     score += 1; 
    } 
} 

} 

Und mein „SaveLoad“ Skript

using UnityEngine; 
using System.Collections; 
using System.Collections.Generic; 
using System.Runtime.Serialization.Formatters.Binary; 
using System.IO; 

public static class SaveLoad { 
public static List<Stats> savedGames = new List<Stats>(); 

public static void Save(){ 
    savedGames.Add(Stats); 
    BinaryFormatter bf = new BinaryFormatter(); 
    FileStream file = File.Create (Application.persistentDataPath + "/savedGames.gd"); 
    bf.Serialize(file, SaveLoad.savedGames); 
    file.Close(); 
} 

public static void Load(){ 
    if (File.Exists (Application.persistentDataPath + "/savedGames.gd")) { 
     BinaryFormatter bf = new BinaryFormatter(); 
     FileStream file = File.Open(Application.persistentDataPath + "/savedGames.gd", FileMode.Open); 
     SaveLoad.savedGames = (List<Stats>)bf.Deserialize(file); 
     file.Close(); 
    } 
} 
} 
+0

Auch wenn es nicht möglich ist, aktuelleumb und Münzen zu sparen –

Antwort

1

Sie sollten keine MonoBehaviour Klasse zum Speichern von Daten serialisiert, dort unten, dass so viel Sie nicht in diese sehen können gib ein, dass es nur falsch ist.

Sie haben auch eine Liste von Stats-Objekt, aber es enthält nur statischen Wert, so dass alle Ihre Stats-Objekte gleichen Inhalt haben.

using UnityEngine; 
using System.Collections; 

public class Stats : MonoBehaviour 
{ 
    StatContainer stats = new StatContainer(); 

    // Use this for initialization 
    void Start() { 
     InvokeRepeating ("AddCoins", 4.0f, 2.0f); 
     InvokeRepeating ("AddScore", 1.5f, 1.5f); 
    } 

    // Update is called once per frame 
    void Update() { 
     this.stats.Update(); 
    } 

    void AddCoins(){  
     stats.AddCoins(); 
    } 

    void AddScore(){ 
     stats.AddScore(); 
    } 
} 
[Serializable] 
public class StatContainer 
{ 
    public int coins = 0; 
    public int totalcoins = 0; 
    public int score = 0; 

    public int personalbest = 0; 
    public float UmbrellaSpeed = 0.1f; 
    public float currentumbdur = 500; 

    public int CarrotSpawnRateLVL = 1; 
    public float CarrotSpawnRate = 60f; 
    public int CarrotSpawnRateUpgradeCost = 15; 

    // and the rest 

    public void Update(){ 
     if (statscore > personalbest) { 
      personalbest = score; 
     } 
    } 
} 

Jetzt können Sie den StatContainer auf die gleiche Weise serialisieren, wie Sie es waren. Da es keine statische Methode mehr gibt, ist jeder StatContainr für jede Stats-Komponente einzigartig und teilt nichts mit anderen.

Und Bonus, Sie können sogar Unit-Test einfacher mit StatContainer durchführen, aber das ist ein anderes Thema.

Verwandte Themen