2016-07-14 5 views
0

Also um es so kurz wie möglich zu machen, versuche ich die wesentlichen Informationen meines Charakters zu speichern, und nicht nur habe ich gehört PlayerPrefs ist schlecht beraten, aber es wird auch nicht richtig für einige der Informationen Ich habe (zum Beispiel, ich kann nicht PlayerPrefs mein Beruf und seine begleitenden Statistiken und geerbten Klasseninformationen), so habe ich ziemlich viel davon ausgegangen, dass die beste, wenn nicht nur, dies durch Serialisierung zu erreichen ist.Serialisierung in Unity

Nun, ich bin ziemlich positiv Ich verstehe Serialisierung in einem Kern Weg, aber ich würde nicht behaupten, dass ich es sehr vertraulich kenne, und damit bin ich in einem Stück gebunden.

Ich habe einige Skripte geschrieben, und here's the gist for them. Hinweis: Meine Skripts können sehr gut sein, aber wenn das so ist, bitte sag es mir. Ich behaupte nicht, dass sie großartig sind, nur dass ich eine Menge da habe, und AFAIK, sie sind alle in Ordnung, es ist nur das Serialisieren, das aus irgendeinem Grund für mich schwierig ist.

Geringfügige Beschreibung von ihnen: Ich versuche einfach ein Zeichenscript für einen Wächter zu machen, der sowohl den Job: Mercenary, als auch den Typ: GuardPrototype übernimmt, und dann möchte ich das retten können. In der Theorie würde das GameControl.cs-Skript das erreichen, aber ich habe Probleme (offensichtlich), und ich habe eine Menge Dinge auskommentiert, weil ich ziemlich ahnungslos bin, lol.

Also, das sagte, ich habe das Persistence and Saving-Tutorial von Unity, aber ich benutze nicht nur verschiedene Skripte,/ich rufe nicht einfache Floats, so hatte ich eine harte Zeit, das zu ändern . Letztendlich möchte ich nur zwei Dinge wissen: Ist mein Code, den ich versuche zu sparen, sinnvoll? Wenn ja, wie um alles in der Welt würde ich Serialisierung verwenden, um die Informationen zu speichern?

Vielen Dank im Voraus, ich schätze jede Hilfe, die ich bekomme.

TL, DR Wie zur Hölle funktioniert Serialisierung mit Dingen, die nicht einfache Floats sind, die in separaten Skripten sind?

Hinweise: Im Folgenden sind die Ketten von Skripten I

  • ClassParadigm verwenden möchten -> Mercenary // dies ist die Aufgabe, die verwendet wird
  • TypeParadigm // weil es mehrere sind könnte es sein, -> StandardParadigm -> GuardPrototype // von allen Standardtypen, es ist von einer Wache

Dann möchte ich ein Skript sie aufrufen lassen. - Zeichen (in diesem Fall GuardA), die dann einen Job annehmen, und ein Typ (beide oben festgelegt), sowie StandardPlayerParadigm // Was ein Standardplayer besitzen wird

Schließlich soll das alles sein auf ein Objekt in Unity gelegt werden, von dem ich dann ein Prefab machen könnte. Mit anderen Worten, wenn dies ein Charakter in meinem Spiel wäre, wäre es immer ein GuardPrototyp + Mercenary, wenn dieses Prefab auf dem Spielfeld wäre.

Edit: Danke an Mike Hunt, weil sie mir definitiv große Zeit mit dem Hauptproblem zur Hand geholfen haben. Ich habe jetzt ein etwas anderes Problem, aber das scheint viel praktikabler.

Erstens I updated my gist. Zweitens ist mir eine Sache in der Einheit mit dem, wenn ich das XmlSerialization Skript zu einem Gameobject anhang, es einig Kind Profile in sie hat (wie ein verschachteltes Menü, das ich es nicht haben will). Ich bin nicht ganz sicher, wie ich das bekämpfen soll, und außerdem scheint es nicht so zu sein, dass es tatsächlich die Werte zuweist, die ich dafür haben möchte (So wie ich will, dass das GuardA-Skript Statistiken von seinem " Typ "Skript, das ich geschrieben habe, aber ich glaube nicht, dass es funktioniert". Ich bin mir sicher, dass ich etwas übertriebenes getan habe und irgendwo in meinem Code, dass es etwas extra genannt hat, aber ich kann nicht für das Leben von mir herausfinden, wo das gewesen wäre.

Also zwei Fragen jetzt: A) Was ist damit los? B) Ist das ein effektiver Einsatz? Habe ich das nicht wie gewünscht umgesetzt?

Auch, dritte Frage: Dies scheint wie eine einwandfreie Methode für doppelte Feinde mit geringen Abweichungen in den Statistiken, aber was genau müsste ich tun, um nur meine Standard-Player zu speichern? Scheint, als ob es immer noch nicht ganz ins Schwarze trifft, aber ich könnte falsch liegen und es einfach nicht merken.

+0

Tags im Tag-Abschnitt gehen, bitte im Titel Ihrer Frage stellt sie nicht. –

Antwort

0

Erstellen Sie eine Klasse, die die Informationen es der Serializable-Attribut zu speichern und dekorieren gespeichert werden:

[Serializable] 
public class Storage{ 
    public string name; 
    public int score; 
} 

Wenn Sie Daten speichern möchten, eine Instanz dieser Klasse erstellen, füllen Sie es, verwenden .NET-Serialisierung und sparen Sie mit PlayerPrefs:

// Create 
Storage storage = new Storage(); 
// Populate 
storage.name = "Geoff"; 
storage.score = 10000; 
// .NET serialization 
BinaryFormatter bf = new BinaryFormatter(); 
MemoryStream ms = new MemoryStream(); 
bf.Serialize(ms, items as Storage); 
// use PlayerPrefs 
PlayerPrefs.SetString("data", Convert.ToBase64String(ms.GetBuffer())); 

Sie mit dem Invert-Prozess abrufen können:

if (PlayerPrefs.HasKey("data") == false) { return null; } 
string str = PlayerPrefs.GetString("data"); 
BinaryFormatter bf = new BinaryFormatter(); 
MemoryStream ms = new MemoryStream(Convert.FromBase64String(str)); 
Storage storage = bf.Deserialize(ms) as Storage; 

Ich würde vorschlagen, dass in ein generisches Verfahren zu konvertieren, so dass Sie jede Art mit einer beliebigen Taste verwenden können:

public static class Save 
{ 
    public static void SaveData<T>(string key, object value) where T : class 
    { 
     BinaryFormatter bf = new BinaryFormatter(); 
     MemoryStream ms = new MemoryStream(); 
     bf.Serialize(ms, value as T); 
     PlayerPrefs.SetString(key, Convert.ToBase64String(ms.GetBuffer())); 
    } 

    public static T GetData<T>(string key) where T: class 
    { 
     if (PlayerPrefs.HasKey(key) == false) { return null; } 
     string str = PlayerPrefs.GetString(key); 
     BinaryFormatter bf = new BinaryFormatter(); 
     MemoryStream ms = new MemoryStream(Convert.FromBase64String(str)); 
     return bf.Deserialize(ms) as T; 
    } 
} 
+0

Also bin ich mit Ihnen die oben Punkt, wo ich die Klasse instanziieren.In meinem Geiste versuche ich es unter Save() von GameControl.cs zu tun, aber ich kann keine Statistiken aus PlayerData auswählen. Das bedeutet für mich, dass ich einen anderen Zugriff auf die Informationen in GuardA benötige. Wenn das gut genug ist, was müsste ich tun, damit die Informationen in GuardA in GameControl.cs funktionieren? – DCoward

+0

Sie sollten GuardA für die Speicherung vermeiden, da es MonoBehaviour ist. Das wird viele nutzlose Informationen serialisieren. Machen Sie eine einfache Klasse, um nur das zu speichern, was Sie brauchen. Wenn Sie Daten abrufen und darauf zugreifen müssen, können Sie die von mir bereitgestellten Methoden SaveData und GetData verwenden. – Everts

+0

Wenn ich es nicht verstehe, versuche ich nichts mit GuardA zu speichern, stattdessen versuche ich mit GameControl zu speichern und zu laden, aber ich kann nicht auf GuardA zugreifen. Und für den Moment bin ich direkt darauf zugreifen (oder zu versuchen), so kann ich nur mit Änderungen speichern, um sicherzustellen, dass ich die Serialisierung kenne. – DCoward

1

Wenn Sie binnary Serialisierung verwenden möchten, die die besten ISerializable umzusetzen sein werden. Sie benötigen 2 Artikel liefern:

  1. Methode für die Serialisierung, das Serializer leiten wird, 'was' und 'wie' zu speichern:

Leere GetObjectData ( SerializationInfo info, Streaming Kontext )

  1. Benutzerdefinierter Contutor. Die ISerializable Schnittstelle impliziert einen Konstruktor mit der Signatur Konstruktor

(SerializationInfo Informationen, Streaming Kontext)

Und wenn Sie ein anderes Beispiel Artikel Object serizalization.

Aber für das Spiel würde ich suggest, um einige benutzerdefinierte Xml-basierten Serizaliser zu sehen, so dass Sie keine Anweisungen für binaryserizaliation bei jeder Klassenänderung schreiben müssen, und nur Eigenschaften benötigt. OFC könnte es einige Probleme mit Eigenschaften in Unity sein :(. .