Die Kunst alles dynamisch zu halten in Spielen (Patreon)
Content
Hi! Na? Ich habe alles erledigt!.. Also ich habe das erledigt, weswegen ich zu nichts anderem kam, dazu kommt hoffentlich in nächster Zeit ein kleines exklusives Video zu. Und allgemein werde ich Patreon bald weitaus mehr pflegen, seit dem wir nur noch den 5$ Tier haben!Bis dahin mal eine Thematik aus der Entwicklung, die echt wichtig ist: Haltet eure Scripte dynamisch!
Und damit meine ich: Versucht Scripte immer so aufzubauen, dass sie nur einen kleinen Part übernehmen und Notfalls ein weiteres Script sie steuert.
Auf dem Bild seht ihr die Spielerfigur und 2 NPCs. Der eine hat einen Hut auf, der andere eine festgelegte Emotion. Beides wäre bis vor Kurzen NICHT möglich gewesen. Vorher gab es ein Script, das die Spielerfiguren bekamen, die dafür sorgen, dass der Server z.B. jede Änderung in die Datenbank einträgt oder kontrolliert, ob man gerade wirklich einen Hut anziehen kann. Und der Code, der dann das auch wirklich macht, also die Hut Grafik anzeigen etc. war ebenfalls in dem Code verwurschtelt. Das war ziemlich dumm, denn die NPCs sollen genau wie der Spieler Kleidung haben können und dafür ein extra Script zu schreiben macht auf dauer nur Probleme.
Die Lösung ist also ein Script, das immer auf Befehle wartet und diese dann umsetzt. "SetHat(HatID)" macht also alles benötigte, damit ein Hut geändert wird (bei ID=-1 würde der Hut entfernt werden). Dadurch, dass das jetzt ein externes Script ist können Spieler, NPCs.. und alles andere auf die gleiche Art und Weise bekleidet werden. Wenn man jetzt eine Schneiderpuppe machen würde, die man einkleiden kann, könnte man einfach wieder dieses Script nutzen und später Sachen wie den "Hat Knochen" festlegen, der halt sagt, an welchen Knochen die Hüte "befestigt" werden sollen.
Und das zieht sich durch das Projekt: Alles muss dynamisch sein. Die Items? Nutzen fast alle das gleiche Script und es gibt maximal ein extra Script für Sonderfunktionen, z.B. der Pfandautomat. Die Dosen, Münzen und Hüte sind aber alle identisch. Sie alle nutzen nur mein "NetworkObject" Script. In der Objekt-Datenbank ist dann bei den Hüten hinterlegt, dass man sie anziehen kann. Aber das wird erst relevant, wenn man im Inventar sie anklickt. Davor wird alles komplett gleich behandelt.
Daher: Egal was ihr vor habt, alles sollte so gut es geht in kleine extra Components aufgeteilt werden, damit ihr später nicht an vielen Orten etwas korrigieren müsst, wenn es nur um eine Kleinigkeit geht. Sobald ihr anfangt alles in viele "If Statements" zu packen stimmt was nicht. Dann hätte ich so was wie:
if (Itemtype==Item.Dose)...ifelse (Itemtype==Item.Geld)... ifelse (Itemtype==Item.HutZylinder) ... ifelse (Itemtype==Item.HutKrone)
und so weiter. Damit macht man sich nur Probleme, deswegen: Von Anfang an alles so dynamisch wie möglich halten.Die Dose und das Geld sind einfach "Sammelobjekte". Warum die trennen? Jedes Item sollte seine eigene ID haben (z.B. Dose = 1, Geld = 2) und ein Shopbetreiber sollte einen Wert haben der bestimmt, was seine Währung ist. In der Stadt fragt er also nach Items mit der ID=2. Aber vielleicht gibt es ja einen Ort, wo man mit Dosen zahlt und er nach ID=1 fragt. Und schon musstest ihr keine irren ifelse Statements machen.
Es ist, vor allem als Neuling, nicht einfach dieses Konzept zu verfolgen. Aber behaltet es im Hinterkopf und versucht einfach immer wieder alles noch einfacher zu machen, wodurch es dynamisch bleibt. Es ist kein muss, aber es macht am Ende alles einfacher!