Jump to content
Unity Insider Forum

Inventar/Container Saven - Singleplayer und Multiplayer


Tarantel

Recommended Posts

Guten Tag erstmal an die Community!

 

 

So damit ich erstmal das Thema genau erläutere:

 

Ich will die Inventare und Container Inhalte wie man sie auch nennen will aus meinem Spiel in einer Datei abspeichern.

 

So jetzt will ich wissen ob eine Savedatei so aussehen kann:

[PLAYER]
{
 [iD = 1]
 {
  [sTATS]
  {
Health = 100;
Thirst = 100;
Hunger = 100;
Stamina = 100;
PVP = 0; //1 = On/0 = Off.
  }
  [inventory]
  {
  [stone = 22],[Wood = 45],[],[],[],[Log = 3],[],[],[Coal = 35],[],[RawMeat = 6],[],[],[],[],[Oil = 2]; //Jedes Kästchen stellt einen Inventar Slot dar.
  ]
  [QuickSlots]
  {
[steelSword = 1],[stoneHatchet = 1],[],[],[ironPickaxe = 1],[],[],[],[],[]; // Hier stellt jedes Kästchen einen Quickslot dar.
  }
  [Equipment]
  {
[Helm]
{
[ironHelm];
}
[Armor]
{
[ironArmor];
}
[Gloves]
{
[ironGloves];
}
[Pants]
{
[ironPants];
}
[shoes]
{
[ironShoes];
}
  }

 [iD = 2]
 {
  [sTATS]
  {
Health = 100;
Thirst = 100;
Hunger = 100;
Stamina = 100;
PVP = 1; //1 = On/0 = Off.
  }
  [inventory]
  {
  [stone = 22],[Wood = 45],[],[],[],[Log = 3],[],[],[Coal = 35],[],[RawMeat = 6],[],[],[],[],[Oil = 2]; //Jedes Kästchen stellt einen Inventar Slot dar.
  ]
  [QuickSlots]
  {
[steelSword = 1],[stoneHatchet = 1],[],[],[ironPickaxe = 1],[],[],[],[],[]; // Hier stellt jedes Kästchen einen Quickslot dar.
  }
  [Equipment]
  {
[Helm]
{
[ironHelm];
}
[Armor]
{
[ironArmor];
}
[Gloves]
{
[ironGloves];
}
[Pants]
{
[ironPants];
}
[shoes]
{
[ironShoes];
}
  }
 }

[CONTAINER]
{
[iD = 1]
{
 ObjectID = WoodenChest;
 OwnerID = 2; //Wem der Behälter gehört.
 PositionX = 21.4532;
 PositionY = 2.2332;
 PositionZ = 250.174326;
 [CONTAIN]
  {
 [stone = 22],[Wood = 45],[],[],[],[Log = 3],[],[],[Coal = 35],[],[RawMeat = 6],[],[],[],[],[Oil = 2]; //Jedes Kästchen stellt einen Inventar Slot dar.
  }
}

[iD = 2]
{
 ObjectID = WoodenChest;
 OwnerID = 1; //Wem der Behälter gehört.
 PositionX = 23.4532;
 PositionY = 2.5332;
 PositionZ = 263.174326;
 [CONTAIN]
  {
 [stone = 22],[Wood = 45],[],[],[],[Log = 3],[],[],[Coal = 35],[],[RawMeat = 6],[],[],[],[],[Oil = 2]; //Jedes Kästchen stellt einen Inventar Slot dar.
  }
}
}

[bUILDINGS]
{
[iD = 1]
{
 ObjectID = SawMill;
 OwnerID = 1;
 PositionX = 23.4532;
 PositionY = 2.5332;
 PositionZ = 263.174326;
}
[iD = 2]
{
 ObjectID = SawMill;
 OwnerID = 2;
 PositionX = 23.4532;
 PositionY = 2.5332;
 PositionZ = 263.174326;
}
}

 

Jetzt ist die Frage wenn es so möglich ist dann wie xD

Ich habe bisher immer nur mit PlayerPrefs gearbeitet aber nun ist es ja wieder was ganz anderes xD

Ich habe schon einige Tutorials gesehen womit man SaveDatas erstellen kann aber leider immer nur auf einfacher Java Basis als String usw.

Aber ich würde es gerne so haben ^^

Damit auch mal der Server Admin der den jeweiligen Server betreibt in die Saves schauen kann usw.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Die kann so aussehen, aber es ist sehr empfehlenswert, bei einem Standard zu bleiben. Benutze kein eigenes Format, sondern XML, JSON oder YAML. Wenn's sein muss, sogar das ini-Format. Nicht nur, dass du dann fertige Klassen benutzen kannst zum Serialisieren, in denen bereits viele Stunden Arbeit stecken - du arbeitest auch mit einem bewährten Standard. Wenn du dir selber was ausdenkst, dann wirst du unglaublich viel Zeit damit vergeuden.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Die kann so aussehen, aber es ist sehr empfehlenswert, bei einem Standard zu bleiben. Benutze kein eigenes Format, sondern XML, JSON oder YAML. Wenn's sein muss, sogar das ini-Format. Nicht nur, dass du dann fertige Klassen benutzen kannst zum Serialisieren, in denen bereits viele Stunden Arbeit stecken - du arbeitest auch mit einem bewährten Standard. Wenn du dir selber was ausdenkst, dann wirst du unglaublich viel Zeit damit vergeuden.

 

Ja aber ich brauche halt was wo jeder sofort eine Übersicht haben kann auch jemand der sich Null mit Programmieren auskennt.

Und ich brauche dann auch ein Format was auf Windows/Linux und Mac läuft.

Da die Server auf allen Plattformen laufen sollen.

Wie ich das bei Linux Servern ohne Grafische Oberfläche hinbekomme weiß ich leider auch noch nicht xD

Link zu diesem Kommentar
Auf anderen Seiten teilen

Jede einzelne der von mir aufgezählten Möglichkeiten entspricht deinen Anforderungen. Schau sie dir doch erstmal an, bevor du es ablehnst ;)

 

Gibt es zu den Möglichkeiten denn auch Infos wie man diese in Unity 5 benutzt ^^

Weil finde ja nur alten Code Kram der nicht mehr funzt xD

Link zu diesem Kommentar
Auf anderen Seiten teilen

Du benutzt ja C# in Unity. Das Schreiben und Lesen von Dateien hat nix mit Unity zu tun, also einfach mal nach "C# YAML" suchen und nicht nach Unity :)

 

Ja nur das Problem ist ich kenne nicht mehr als PlayerPrefs xD und habe noch nie außerhalb von Unity mit C# gearbeitet und habe C# auch erst vor nem Monat angefangen xD

Habe vorher nur mit JS in Unity gearbeitet xD

 

Ich kann mir nicht so gut vorstellen wie ich Codes außerhalb von Unity in Unity anwenden kann xD

JSON für die ItemDB konnte ich auch nur in meinem Spiel nutzen weil es dazu genug Tipps im Netz gibt die extra auf Unity 5 ausgelegt sind ^^

Für mich ist das alles quasi Neuland wie für Merkel das Internet :P

Link zu diesem Kommentar
Auf anderen Seiten teilen

Joa, dann mal ran an den Speck! Von nichts kommt nichts!

Wie können dir gerne bei bestimmten Fragen helfen, aber anfangen musst du selbst.

Das hier sieht doch ganz vielversprechend aus: https://msdn.microso...412179(v=vs.110).aspx

 

Ok eine Frage xD

Wie speichert man überhaupt ein ganzes Objekt mit allen unterobjekten als String in den PlayerPrefs ? weil hab das zuletzt vor 4 Jahren gemacht mit JS xD

und das waren eig nur Pfeile und Tote Tiere xD

Und ja ich frage das weil in jeder Anleitung zum Saven von irgendwas nie beschrieben wird wie das Grundprinzip dahinter funktioniert.

Ich weiß nur wie ich Namen und Zahlen in den PlayerPrefs speicher aber mehr auch nit xD hab damit wirklich nicht viel am Hut und wenn ich was finde was interessant klingt dann ist es meist zu alt als das es noch irgendwie mit der aktuellen Version von Unity in Verbindung gebracht werden kann.

 

Ich brauche quasi Grundkurs in Objekte speichern für Anfänger weil früher hab ichs ja mit JS gemacht aber da wars auch irwie einfach und es gab genug die einem das gezeigt haben aber jetzt haben da fast alle aufgehört und oder tippen alles einfach nur von jemand anders ab aber erklären nichts mehr.

 

Ich kann nicht einfach auf nen Code schauen und direkt alles verstehen.

Ich brauch für alles eine genaue Erklärung weil anders gehts bei mir nicht wenn ich nicht alles über etwas wissen kann versteh ich nichts mehr xD

Deswegen lade ich mir auch keine fertigen Scripts usw ausm Asset Store weil dort Null erklärt wird und ich damit dann nix anfangen kann xD

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich weiß nur wie ich Namen und Zahlen in den PlayerPrefs speicher aber mehr auch nit

Mehr kann PlayerPrefs halt auch nicht. Wenn du was komplexeres speichern willst, musst du es selber machen.

Kleines Beispiel, wie man ein Vector3 speichern und laden kann:

public static void SetVector3(string key, Vector3 value)
{
 PlayerPrefs.SetFloat(key + "__x", value.x);
 PlayerPrefs.SetFloat(key + "__y", value.y);
 PlayerPrefs.SetFloat(key + "__z", value.z);
}

public static Vector3 GetVector3(string key)
{
 return new Vector3(PlayerPrefs.GetFloat(key + "__x"), PlayerPrefs.GetFloat(key + "__y"), PlayerPrefs.GetFloat(key + "__z"));
}

 

Aber mal ehrlich, eben war es noch superwichtig, dass Menschen die Savegame-Datei gut lesen können, das ist bei PlayerPrefs ja nicht so richtig der Fall, oder ;)

Die Anleitung auf der Seite, die ich gepostet habe (den Link habe ich gerade nochmal repariert) ist wesentlich simpler als die meisten anderen Lösungen, die hier infrage kommen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Mehr kann PlayerPrefs halt auch nicht. Wenn du was komplexeres speichern willst, musst du es selber machen.

Kleines Beispiel, wie man ein Vector3 speichern und laden kann:

public static void SetVector3(string key, Vector3 value)
{
 PlayerPrefs.SetFloat(key + "__x", value.x);
 PlayerPrefs.SetFloat(key + "__y", value.y);
 PlayerPrefs.SetFloat(key + "__z", value.z);
}

public static Vector3 GetVector3(string key)
{
 return new Vector3(PlayerPrefs.GetFloat(key + "__x"), PlayerPrefs.GetFloat(key + "__y"), PlayerPrefs.GetFloat(key + "__z"));
}

 

Aber mal ehrlich, eben war es noch superwichtig, dass Menschen die Savegame-Datei gut lesen können, das ist bei PlayerPrefs ja nicht so richtig der Fall, oder ;)

Die Anleitung auf der Seite, die ich gepostet habe (den Link habe ich gerade nochmal repariert) ist wesentlich simpler als die meisten anderen Lösungen, die hier infrage kommen.

 

Sorry war da schon extrem müde ^^ ja ich will keine PlayerPrefs nutzen ich wollte nur sagen das ich damit bisher nur gearbeitet habe ^^

 

Nun habe ich ein weiteres Problem xD

 

Meine Inventar Struktur sieht so aus:

Alles läuft über ein UI!

Die Slots die Items die angezeigt werden und die Menge und in welchem Slot sie sich gerade befinden.

Die Menge wird über ein Text UI angezeigt und sonst in keiner Variable ausgegeben.

 

Kann ich diesen Text auch so abspeichern ohne ihn extra in eine Variable zupacken ?

Oder muss ich diese ganzen Dinge erstmal ohne UI machen und dann kann ich erst anfangen ans speichern von sowas zudenken ?

 

Inventar aufbau:

Alles UI Elemente!

Inventory (Canvas)
Panel
 Inventory Panel
Slot Panel
 Slot1
  Item (Item Icon)
   Text (Zeigt die Menge an)
 Slot2
  Item
   Text
 Slot3
  Item
   Text
 Slot4
  Item
   Text
 Slot5
  Item
   Text
 Slot6
  Item
   Text
 Slot7
  Item
   Text

 

Die einzelnen Slots werden beim Start leer generiert.

Es gäbe eine Möglichkeit dies mit PlayerPrefs zulösen aber dadurch würden die Items nicht immer an den selben Slots sein wie sie vor dem verlassen des Spiels waren.

Quasi eine Abfrage wie viel von welchem Item schon vorhanden war und sie einfach wieder über Commands adden lassen.

Nur sowas ist Müll xD

Deswegen frage ich ja xD

Will das Inventar mit den UI Elementen nicht aufgeben weil ich es besser finde.

Ich habe das Inventar nicht als Array aufgelistet in einem Object sondern nur über die UI Elemente einzeln pro Slot.

 

Daher weiß ich einfach nicht wie ich dies lösen kann

Link zu diesem Kommentar
Auf anderen Seiten teilen

Text.text ist ja schon eine Variable. Eigentlich vermutlich eine Property, aber das kann dir ja egal sein.

Du kannst es trotzdem alles hübsch machen mit einem kleinen Script, das auf jedem Slot liegt und das Item und was du sonst noch an Info pro Slot hast verwaltest.Mit Propertys geht das ganz hübsch:

private Text slotText;
public string itemName
{
 get { return slotText.text; }
 set { slotText.text = value; }
}

void Awake()
{
 slotText = GetComponentInChildren<Text>();
}

Link zu diesem Kommentar
Auf anderen Seiten teilen

Text.text ist ja schon eine Variable. Eigentlich vermutlich eine Property, aber das kann dir ja egal sein.

Du kannst es trotzdem alles hübsch machen mit einem kleinen Script, das auf jedem Slot liegt und das Item und was du sonst noch an Info pro Slot hast verwaltest.Mit Propertys geht das ganz hübsch:

private Text slotText;
public string itemName
{
 get { return slotText.text; }
 set { slotText.text = value; }
}

void Awake()
{
 slotText = GetComponentInChildren<Text>();
}

 

Dieses Script als Beispiel bringt doch nur etwas wenn ich eins für jeden Slot erstelle oder nicht ?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Du erstellst ein Script und das ziehst du dann auf jeden Slot ein Mal.

 

Das brauch ich ja nur 1x auf nen Slot ziehen da die Slots erst beim Start der Szene erzeugt werden.

Der Slot ist an sich nur ein UI Prefab mit Slot/Item Image/Text.

Die werden dann über die jeweiligen Container erzeugt aber alle nutzen die selben Slots an sich.

Kann es da dann zu Problemen kommen da diese nicht mehr zum Inventar gehören ?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das brauch ich ja nur 1x auf nen Slot ziehen da die Slots erst beim Start der Szene erzeugt werden.

Der Slot ist an sich nur ein UI Prefab mit Slot/Item Image/Text.

Sehr gut :)

 

Die werden dann über die jeweiligen Container erzeugt aber alle nutzen die selben Slots an sich.

Kann es da dann zu Problemen kommen da diese nicht mehr zum Inventar gehören ?

Ich weiß nicht genau, was da jetzt wo nicht mehr zu gehört, aber von Problemen kann erst die Rede sein, wenn du ein Konzept für das Script hast. Vorher kann man ja zu nix eine Aussage treffen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Sehr gut :)

 

 

Ich weiß nicht genau, was da jetzt wo nicht mehr zu gehört, aber von Problemen kann erst die Rede sein, wenn du ein Konzept für das Script hast. Vorher kann man ja zu nix eine Aussage treffen.

 

Nächstes Problem ^^

Wenn ich das Script auf den Prefab Slot ziehe und dann die Slots erzeugt werden haben sie ja alle die gleichen IDs so gesehen.

Wenn ich dann etwas speichern will packt er ja dann in jeden Slot dasselbe oder nicht ?

Wie kann ich machen das er jeden Eintrag einen eigenen ID zuweist damit er weiß in welchen Slot was gehört und wie gebe ich den Slots IDs wenn sie alle nach dem generieren nur Slot(Clone) heißen ? xD

Hab da jetzt keine Idee wie man sowas machen kann

 

Hiermit werden die Slots generiert.

if(InventoryType == InventoryTypeEnum.CharacterPanel)
 {
  for(int i = 0; i < slotAmount; i++)
  {
items.Add(new Item());
slots.Add(slotPanel.transform.GetChild(i).gameObject);
slots[i].GetComponent<Slot>().id=i;
  }
 }
 else
  for(int i = 0; i < slotAmount; i++)
  {
items.Add(new Item());
slots.Add(Instantiate(inventorySlot));
slots[i].GetComponent<Slot>().id=i;
			slots[i].transform.SetParent(slotPanel.transform,false);
  }

 

Nur ich hab wirklich keinen Plan wie man da was ändern kann.

Beim normalen Instantiate könnte man es so lösen.

 

Slot = Instantiate(inventoryslots, Vector3(27,14.3,-19), transform.rotation);
  Slot.name = "Slot"+nextNameNumber;
  nextNameNumber++;
Link zu diesem Kommentar
Auf anderen Seiten teilen

Ok jetzt hab ich dem Slot Script was ja schon vorher drinne war beigefügt das er dem Slot immer einen öffentlichen ID gibt xD

Vorher wurde der ID immer nur im Item selbst angegeben und das bringt mir ja nicht viel wenn die Leeren Slots dadurch keinen ID haben.

Habe jetzt schon mal ein grobes Beispiel fürs saven angefangen.

 

 

So hab ne weitere class im Slot Script beigefügt.

Mal schauen wie weit ich jetzt komme xD

public class SaveandLoad
{
public int SaveSlotID;
public string SaveItemName;
public Sprite SaveItemImage;
public int SaveItemAmount;
public void save ()
{
 if (GameObject.Find ("/Inventory")) { //Mir wurde gesagt das er so schaut ob ein Object Namens Inventory in der Object Hierarchy vorhanden ist aber das er nicht die ganze Szene nimmt oder liege ich da falsch ?

 }
}
public void load ()
{
 if (GameObject.Find ("/Inventory")) {
 }
}
}

Link zu diesem Kommentar
Auf anderen Seiten teilen

Jut Danke für die ganze Hilfe ^^

Ich hab das alte Inventar erstmal übern Haufen geworfen xD

Hab die Übersicht komplett verloren und hab es zu sehr aufgeteilt.

Ich mache ein neues wo ich direkt am Anfang schon alles vormerke was gespeichert wird xD

Ich hab am Anfang einfach nicht daran gedacht und hab nur drauflos gedaddelt xD

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...