2017-12-07 4 views
1

verbracht meine letzten zwei Stunden helfen versuchen zu lernen, wie meine Daten zu serialisiert ich brauche einen Code, der meine Daten in „StatContainer“ serialisiert ich dies versucht:Benötigen Sie in Serialisierung

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

und viel mehr aber ich war nicht fähig zu verstehen, wie meine Daten serialisiert

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(){  
    if (BunnyScript.BunnyAlive == true) { 
     StatContainer.coins += 1; 

    } 
} 

void AddScore(){ 
    if (BunnyScript.BunnyAlive == true) { 
     StatContainer.score += 1; 
    } 
} 
} 
[System.Serializable] 
public class StatContainer 
{ 
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; 
// and the rest 

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

das ist, wie ich versuche, es

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<StatContainer> savedGames = new List<StatContainer>(); 

//it's static so we can call it from anywhere 
public static void Save() { 
    SaveLoad.savedGames.Add(StatContainer.current); 
    BinaryFormatter bf = new BinaryFormatter(); 
    //Application.persistentDataPath is a string, so if you wanted you can put that into debug.log if you want to know where save games are located 
    FileStream file = File.Create (Application.persistentDataPath + "/savedGames.gd"); //you can call it anything you want 
    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<StatContainer>)bf.Deserialize(file); 
     file.Close(); 
    } 
} 
} 
zu serialisiert

Ich bin der Last fuction in beggining des Spiels aufrufen und pariert alle 2 Sek

+0

Also, was ist Ihre Frage? – kirkpatt

+0

Wie serialisiert ich die Daten in StatContainer –

+0

Sie müssen weitere Informationen zu Ihrem Problem hinzufügen. – kirkpatt

Antwort

0

Zuerst entfernen statische Mitglieder StatContainer
in Wiederholung mit aufrufen, um Ihre Daten machen Load-Funktion Rückkehr StatContainer zugreifen und in Ihrer Klasse Stats können Sie setzen StatContainer in statisch oder erstellen Sie eine singleton von Stats.

Zweitens weiß ich nicht Ihren Zweck, aber vielleicht können Sie einen Blick auf xml serialization statt BinaryFormat nehmen, um eine Datei zu haben, der durch den Menschen lesbaren und so können Sie easely die Daten ändern.
In diesem Fall suggest ich Ihnen, um zu sehen Xml-Tags wie unten.
(Und Sie können Ihre xml verschlüsseln, wenn Sie Ihr Spiel freigeben)

[System.Serializable] 
[XmlRoot(ElementName = "stats-of-something")] 
public class StatContainer 
{ 
    [XmlAttribute(AttributeName = "coins")] 
    public int coins = 0; 
    [XmlElement(ElementName = "umbrella-speed")] 
    public float UmbrellaSpeed = 0.1f; 
} 

oder

[System.Serializable] 
[XmlRoot(ElementName = "stats-of-something")] 
public class StatContainer 
{ 
    [XmlAttribute(AttributeName = "coins")] 
    private int _coins = 0; 
    [XmlElement(ElementName = "umbrella-speed")] 
    private float _umbrellaSpeed = 0.1f; 

    public int coins { get { return _coins; } set { _coins = value; } } 
    public float umbrellaSpeed { get { return _umbrellaSpeed ; } set { _umbrellaSpeed = value; } } 
}