Jump to content
Unity Insider Forum

Item-System: Welche Möglichkeiten gibt es?


Triky313

Recommended Posts

Hi Leute,

ich sitze gerade an der Planung eines Item/Inventar-System.

 

Ich habe einige Tutorials einfach mal durchgearbeitet um mir ein Bild zu machen was es so gibt. Trotzdem sind noch ein paar Fragen offen geblieben.

 

Ich würde gern Items mit variablen Werten erstellen. Heißt, Name, Beschriftung oder auch ID sind natürlich feste Werte. Es sollen aber Werte wie Stärke [1-10] usw. gerollt werden.

 

Warum erwähne ich das? Ganz einfach, zurzeit verwende ich eine JSON-Datei, welche leicht editiert werden kann.. leider auch von anderen.

 

Hat da jemand eine Idee wie man so etwas am besten angeht?

 

Ich dachte daran, die JSON-Datei vor jedem Release von einem Hash-Code zu belegen, sobald diese geändert wird, funktioniert es nicht mehr.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Es geht mir nicht unbedingt darum alles vehement vor Cheatern zu schützen. Eher darum, dass man nicht mit ein paar Klicks und Zahlen-Änderungen alles über den Haufen werfen kann.

 

Ist es überhaupt gut dafür eine JSON zu nehmen, von der Performance her?

Ich weiß leider nicht, was so gang und gebe ist.

Link zu diesem Kommentar
Auf anderen Seiten teilen

JSON ist ok, weil es leicht zu erzeugen und zu verwenden ist. Von der Lesbarkeit her würde ich allerdings normales XML bevorzugen, vor allem, wenn du das per Hand ändern willst.

 

Die Performance leidet höchstens darunter, wenn du ständig Disk-IO produzierst durch dauerndes Lesen und schreiben von solchen Dateien.

 

Ich würde es so machen, dass du die JSON oder XML schreibst und dann über ein kleines Tool verschlüsselst. In deiner App verwendest du nur die verschlüsselten Dateien.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich kenne mich mit JSON nicht so gut aus, aber ich benutze zum Abspeichern meiner Inventare immer XML. Es ist einfach und geht sehr schnell und bietet einem eben viele Möglichkeiten. Wie das bei JSON so aussieht kann ich leider nicht sagen. Aber wie Hrungdak schon sagte: Eine leichte kleine Verschlüsselung sollte schon die Meisten Spieler davon abraten irgendwas zu versuchen

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also habe nun JSON genommen.. für die RohWerte eines Items reicht das aus.

Zum speichern des Spiels selbst muss ich später mal gucken.. sollte JSON da nicht ausreichen, werde ich auf XML umbauen müssen.

 

Ja, das mit dem verschlüsseln klingt ganz gut, ich schaue mir das am Wochenende mal an.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Meine Meinung:

Kann man das Spiel online/im (offenen) Multiplayer spielen -> Alle relevanten (gespeicherten) Daten auf dem Server halten, sodass die Spieler gar nicht erst dran kommen

Kann man das Spiel nur offline/per LAN/geschlossene Sitzung(Coop) spielen -> Lass die Spieler doch modden wie sie möchten

 

Ich fands zum Beispiel bei Die Gilde 2 immer ganz angenehm, dass das Startkapital einfach in einer config plain text drin steht und GTA San Andreas wäre für mich nicht das gleiche gewesen wenn man keine Cheatcodes gehabt hätte ^^

Link zu diesem Kommentar
Auf anderen Seiten teilen

Lass die Spieler doch modden wie sie möchten

 

Kann ich nur zustimmen. Das macht aber auch nur Sinn, wenn es kein öffentliches Rangsystem im Onlinemodus etc. geben soll. Gerade Spiele wie Minecraft oder Spiele die auf der Source Engine liefen sind eben immer noch wegen ihrer Modfreundlichkeit so beliebt.

 

Zurück zum Thema:

Wenn dein Spiel komplexer ist und es viele Details zum Abspeichern gibt, würde ich nach wie vor eher zu XML raten.

Aber letzendlich ist es auch eine Frage der Anwendung

Link zu diesem Kommentar
Auf anderen Seiten teilen

Kann ich nur zustimmen. Das macht aber auch nur Sinn, wenn es kein öffentliches Rangsystem im Onlinemodus etc. geben soll. Gerade Spiele wie Minecraft oder Spiele die auf der Source Engine liefen sind eben immer noch wegen ihrer Modfreundlichkeit so beliebt.

 

Zurück zum Thema:

Wenn dein Spiel komplexer ist und es viele Details zum Abspeichern gibt, würde ich nach wie vor eher zu XML raten.

Aber letzendlich ist es auch eine Frage der Anwendung

 

Also im Prinzip habt ihr Recht und ich gehe immer nur von mir aus. Ich spiele zuviel an einem Spiel rum, bis es nicht mehr so ist wie es sein soll.

 

Das Spiel wird eine Art "Roguelands", nur mit einem Waffen-System ähnlich wie bei Borderlands.. also von den Variationen her.

Gespeichert werden dann wohl nur das PlayerLevel, Inventar, Statistiken (Story-Fortschritt). Könnte sich vielleicht lohnen auf XML zu setzen. Zumal die Spieler dann wohl wirklich eigene Waffen oder auch Monster hinzufügen können.. jetzt habt ihr mich aber wieder. :lol:

 

Ach und eine Frage habe ich noch..

Wie geht ihr beim mit dem Laden und der Sortierung der Items um?

 

XML

<ItemCollection>
 <weapon>
   <sowrd>
   </sowrd>
   <bow>
   </bow>
   usw..
 </weapon>
 usw..
</ItemCollection>
..oder besser..
<ItemCollection>
 <item type="weapon">
 </item>
 usw..
</ItemCollection>

 

Im Endeffekt wäre es doch besser gleich alles im Speicher zu haben als immer nachzuladen oder nicht? So groß ist mein 2D-Game dann nicht, als das das nicht passen würde.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Im Endeffekt wäre es doch besser gleich alles im Speicher zu haben als immer nachzuladen oder nicht? So groß ist mein 2D-Game dann nicht, als das das nicht passen würde.

 

Ja da hast du recht. Wenn du keine gewaltigen Datenmengen hast, lade einfach alles sofort rein. Somit hälst du dein Speicher- und Ladesystem einfach und unkomplex. Eigentlich sollte das bei deinen Datenmengen völlig ausreichen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo noch mal..

ich bin noch immer am überlegen mit meinem Item-System. Ich habe mittlerweile alles auf XML umgestellt.

Nun habe ich das http://forum.unity-community.de/blog/3/entry-11-scriptableobjects-assets-fur-jeden-zweck-oder-wie-man-ein-inventarsystem-richtig-baut/ gesehen und bin mir noch nicht ganz sicher inwiefern mir das helfen kann.

 

Meine Items werden oft (nicht alle) variable sein.. heißt, Schwert mit der ID 1 kann es in zich verschiedenen Versionen mit unterschiedlichen Stats geben. Ich habe überlegt Items in Objekten zu erstellen, die dann auch auf dem Bildschirm oder im Inventar genutzt werden können. Frage ist nur, ist das von der Performance her so gut?

 

Ein Gegner kann gut und gern mal 1-10 Items droppen.

Hat da jemand vielleicht Erfahrung mit und ein paar Tipps?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wenn du die Stats im XML beschreibst, würde ich den ersten Weg nehmen:

 

<Items>
   <Weapons>
    <Weapon name="sword">
	    <Property name="attack">3</property>
	    <Property name="durability">100</property>
	    <Property name="weight">3</property>
	    <Property name="range">1</property>
    </Weapon>
    <Weapon name="bow">
	    <Property name="attack">1</property>
	    <Property name="durability">100</property>
	    <Property name="weight">2</property>
	    <Property name="range">2</property>
    </Weapon>
   </Weapons>
   <Armors>
    <Armor name="helmet">
	    <Property name="armor">1</property>
	    <Property name="durability">100</property>
	    <Property name="weight">1</property>
    </Armor>
   </Armors>
<Items>

Vorteil:

Wenn du das XML im Spiel auswertest (ich empfehle über XDocument, nicht XMLDocument), kannst du sehr einfach Waffen, Armor usw. einzeln rausholen. Außerdem ist so die Erstellung und Pflege der XML-Datei relativ einfach.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich will jetzt keine Aussage darüber machen, ob standartisierte Datenhaltungsdateien (XML, JSON, YAML usw.) oder ScriptableObjects besser sind. Ich würde aber gerne etwas die Verwirrung über ScriptableObjects vermindern.

 

ScriptableObjects sind genauso Datenhaltungs-Objekte wie es Objekte in anderen Dateiformaten sind. Sie haben die Vorteile, dass Unity sie eigenständig einliest, sie im Editor schön bearbeitbar sind (sogar mit CustomEditor, wenn gewünscht) und man beim Kompilieren die Inhalte validieren kann (in einer XML kann eher versehentlich Müll drinstehen).

ScriptableObjects haben keinerlei vorgegebene Semantik in einem Projekt oder einer Szene. Genau wie mit Daten in einer XML-Datei kannst du mit den Daten in deinen ScriptableObjects machen, was du willst.

 

Wenn du jetzt variable Items hast, dann musst du die Variablen dafür definieren. Ob du das in einer XML machst...

<Property name="damage">10-30</Property>

...oder in einem ScriptableObject...

public FloatRange damage;

...ist völlig wurscht.

In dem Beispiel wäre FloatRange ein simples Struct, das zwei Floats beinhaltet.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi,

danke für die Anmerkungen.

Wie genau ich die Item-Werte nachher berechne weiß ich noch nicht. Theoretisch soll das nachher einfach in einer Methode sein.. RohItem rein FertigItem raus.

Danke aber für die Erklärung zu ScriptableObjects, habe mir bislang noch nichts genaueres darunter vorstellen können.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...