schadowhunter's Kill All Zombies! TD

  • So - speichern funktioniert!


    Die Option(en), FPS anzeigen oder nicht, werden gespeichert. Außerdem haben verschiedene Monster verschiedene XP Werte. Schafft der Spieler ein Level, werden die kumulierten XP Levelübergreifend gespeichert. Das heißt, der Spieler kann jetzt in verschiedenen Leveln in verschiedenen Spielsessions XP sammeln und damit dann später im Level aufsteigen und Skills freischalten.


    Außerdem habe ich heute morgen beim Kaffee zwei weitere Models "zusammengeklickt": einen Wagen und eine Tür. Ich will ja nach und nach die Level etwas aufhübschen und das Setting ausbauen.



    Ich fände es ganz cool, wenn der Spieler mit dem Level interagieren kann. Zum Beispiel: ein paar mal auf den Wagen schießen, dann geht er kaputt/bricht auseinander. Das hat zwar keine wirkliche "Spielfunktion", aber erweckt die Welt zum Leben...

  • Kannst ja im Wagen ein paar Münzen oder nen Boost verstecken^^


    Gute Idee ;)


    Ich hatte eben ein Problem, das hat mich vielleicht Nerven gekostet.


    Der Trick in meinem Spiel ist es wie gesagt, durch schlaues Platzieren der Sperren die Mobs einen möglichst langen Weg laufen zu lassen. Ich habe nun an der "Roffassung" einer Highlevel Map gearbeitet.


    Ich versuche, dem Spieler verschiedene Lösungsmöglichkeiten anzubieten. Eine seht ihr hier: Indem die "große Straße" unten in zwei lanes geteilt wird, kann man den Weg, den die Zombies laufen müssen, theoretisch mehr als verdreifachen.



    Nun kommt aber das Problem: Ich prüfe per Find Path to Actor Synchronously und is partial, ob es einen gültigen Pfad gibt (damit Spieler den Weg nicht komplett sperren/verbauen können.


    Aber obwohl (!) es einen gültigen Weg gibt/gab, hat mein Spiel ab einer bestimmten Länge angefangen, einen Error zu schmeißen. Beziehungsweise das Spiel hat behauptet, es gäbe keinen gültigen Pfad, obwohl es eben einen hab.



    Ich habe das System 3 mal umgebaut, bis mir das offensichtliche auffiel: Die Node "Tether Distance" legt offensichtlich fest, wie "lange" er nach Umwegen sucht. Sprich: Je höher der Integer, desto längere "Umwege" und Pfade sucht er. Ich hatte keine Ahnung und hab die auch vorher nie benutzt.


    Naja, jedenfalls spawnt die Node mit einem sehr niedrigen Grundwert von 50. Ich hab das auf 1000 gestellt und alles läuft perfekt. Ich hätte mir etwas über 2 Stunden Arbeit sparen können, indem ich einfach ein paar Zahlen tippe. ||:thumbup:

    • Offizieller Beitrag

    Der Trick in meinem Spiel ist es wie gesagt, durch schlaues Platzieren der Sperren die Mobs einen möglichst langen Weg laufen zu lassen. Ich habe nun an der "Roffassung" einer Highlevel Map gearbeitet.


    Ich versuche, dem Spieler verschiedene Lösungsmöglichkeiten anzubieten. Eine seht ihr hier: Indem die "große Straße" unten in zwei lanes geteilt wird, kann man den Weg, den die Zombies laufen müssen, theoretisch mehr als verdreifachen.

    Ich hab dass glaube ich schonmal vorgeschlagen wie wäre es wenn die Zombies einen merkstöckigen Tum hinauf laufen.


    Achtung Wortspiel "Tower Defense"


    1.Zombies Starten im ersten Stock Sobald die ein Portal erreichen, landen sie im 2. Stock.

    2.Der Spieler kann durch die Tasten 1 - 9 zwischen den Stockwerken hin und her wechseln. (oder mit dem Mausrad)

    3.In den unteren Stockwerken könntest du einbauen womit man Gegener Sortieren kann die dann den nächsten Stock separat von anderen Gegner betreten.


    Ich finde dadurch hättest du ganz neue Strategische Möglichkeiten.

  • Ja, die Idee habe ich mir auch schon notiert.


    Mein aktueller Ansatz ist, verschiedene Arten von "Sperren" zu haben. Also aktuell gibt es eine einzige Sperre zum blockieren des Weges. Ich würde gerne weitere Sperren haben, die bestimmte Arten von Gegnern rausfiltern.


    Zum Beispiel: "Feuermauer". Blockiert alle Gegner, außer die vom Element Feuer, also Feuerzombies laufen durch. Dann kann man die Gegner, genau wie du vorschlägst, auf zwei Lanes sortieren und hat eine Lane, die man mit Fallen vollkleistern kann, die effektiv gegen Feuer sind usw.


    Aber das ist noch relativ weit in der Zukunft.


    Heute habe ich erstmal "Mana" eingefügt, damit der Spieler nicht mehr unendlich Zombies "von Hand" töten kann. Das hab ich ewig vor mir her geschoben, aber jetzt funktioniert alles inklusive Mana progress bar im Interface.

    • Offizieller Beitrag

    Ich weiß nicht ob dir der Begriff "Micromanagment" etwas sagt. Das ist bei vielen Strategiespielen das wichtigste Element.

    Micromanagment bedeutet das man Einheiten oder einzelne Prozesse im multitask separat steuern kann.

    Beispiel: Man schießt mit einer einzigen sehr schwachen Einheit auf einen Panzer der viel stärker ist. Da der Panzer eine dumme KI ist oder der gegenspieler ihm keine Befehle gegeben hat folgt der Panzer der Einheit. Er verlässt dadurch den Verband wodurch die die restlichen Verbände einfacher zu besiegen sind.

    Im Prinzip geht es darum im Micromanment möglichst viele Befehle parallel auszuführen.


    Dazu gehört ein gewissen organisieren in deinem Fall der Türme und fallen der richtige Umgang mit der Tastatur und Timeing.

    Wer den Dreh raus hat, der hat einen riesen Vorteil gegenüber seiner Gegner.


    Ich finde das eine sehr spannende Spielemechanik wenn der Spieler nochmal direkt EInfluss auf das Geschehen nehmen kann.

  • Level, Session-übergreifender-Fortschritt und ein Skilltree mit bisher zwei Skills ist im Spiel und funktioniert! ^^


    Externer Inhalt www.youtube.com
    Inhalte von externen Seiten werden ohne Ihre Zustimmung nicht automatisch geladen und angezeigt.
    Durch die Aktivierung der externen Inhalte erklären Sie sich damit einverstanden, dass personenbezogene Daten an Drittplattformen übermittelt werden. Mehr Informationen dazu haben wir in unserer Datenschutzerklärung zur Verfügung gestellt.

  • Mal eine allgemeine Frage: Was ist der beste bzw. naheliegenste Ansatz bezüglich localization? Also im Hinblick auf verschiedene Sprachen?


    Mich nervt mein Deutsch-Englisch-Gemisch, ich hätte gerne in den Optionen einen Button "Deutsch" und einen Button "Englisch" und wenn man den Button klickt, lädt er sämtliche relevanten Texte und Strings in der entsprechenden Sprache.


    Das habe ich ehrlich gesagt noch nie gemacht. Wie geht man das in der UE an?


    Mein erster Ansatz wäre jetzt eine Art Tabelle anzulegen und die richtige Übersetzung für einen bestimmten key abzufragen? Also zum Beispiel:


    keyende
    $startgameStart GameSpiel starten
    $baumodusBuilding ModeBaumodus
    • Offizieller Beitrag

    Stichwort "Datatable"


    Externer Inhalt www.youtube.com
    Inhalte von externen Seiten werden ohne Ihre Zustimmung nicht automatisch geladen und angezeigt.
    Durch die Aktivierung der externen Inhalte erklären Sie sich damit einverstanden, dass personenbezogene Daten an Drittplattformen übermittelt werden. Mehr Informationen dazu haben wir in unserer Datenschutzerklärung zur Verfügung gestellt.


    Das schöne ist du kannst die Tabelle runterladen und beispielsweise in Office oder ähnlichem einlesen.

    Dort könntest du dir leicht eine Maske bauen wo du dann zb ein Wort oder ein Satz in allen Sprachen hinzufügen kannst und dann die gesamte Tabelle wieder in Unreal hochladen.


    Du kannst so nicht nur Texte bestimmten sondern zb auch den Maximalen Damage einer deiner Türme über solch eine Tabelle festlegen. Der Vorteil ist dann, das du beim Balancing schnell die Werte verändern kannst in dem du nur eine Zahl anpasst und nicht jedesmal die Blueprints bearbeiten musst.


    Ich hab schon systeme gesehen wo so neue Objekte dynamisch in Unreal hinzugefügt werden können. Ein das Icon auswählen, das 3D Modelle und alle nötigen Werte bestimmten und schon kann ein neues Bauteil im Build Menü verfügbar sein.

  • Wow, das ging schnell. Passt, wackelt und hat Luft!



    Im Grunde genommen genau was ich wollte. In der Game Instance setze ich eine String "en" oder "de" und die Buttons Fragen in ihrer GetText Funktion einfach die entsprechende Zelle im Data table ab.


    Das sind so Momente, wo ich die Unreal Engine liebe. Im Grunde genommen ein komplettes Feature in 10 Minuten komplett funktionsfähig implementiert. Danke!


    Und ja, du hast völlig recht. Mit den Data Tables tut sich mir grade eine neue Welt auf.

    • Offizieller Beitrag

    Hier so ein Beispiel wie das aussehen kann:

    Externer Inhalt www.youtube.com
    Inhalte von externen Seiten werden ohne Ihre Zustimmung nicht automatisch geladen und angezeigt.
    Durch die Aktivierung der externen Inhalte erklären Sie sich damit einverstanden, dass personenbezogene Daten an Drittplattformen übermittelt werden. Mehr Informationen dazu haben wir in unserer Datenschutzerklärung zur Verfügung gestellt.

  • Okay aber der DataTable an sich ist statisch, korrekt? Also ich kann einzelne Rows in der Engine verändern, aber nicht im laufenden Spiel per BP, korrekt?


    Denn mein "Problem" hier wäre ja, wenn ich die Türme per Data Table manage: Sowas wie Schaden und Cooldown der Türme sind ja nicht statisch. Einfachstes Beispiel z.B., wenn der Spieler per Skill den Schaden eines Turmes erhöht. Dann müsste ich die entsprechende Reihe im Data Table ja modifizieren. Also wenn der Cooldown des Feuerfeldes z.B. reduziert wird. Das geht nicht, oder?

    • Offizieller Beitrag

    Okay aber der DataTable an sich ist statisch, korrekt? Also ich kann einzelne Rows in der Engine verändern, aber nicht im laufenden Spiel per BP, korrekt?

    In ein Datatable zur Laufzeiten schreiben geht nicht. Es gibt zwar wege über Plugins aber ich weiß nicht ob ich diesen Weg gehen würde.


    Ich hatte vor einige Zeit nach wegen gesucht Tabellen Runtime zu importieren. Mein EIndruck ist das dass alles sehr unglücklich gelöst ist. Deswegen würde ich, einen Bogen darum machen :)





    Denn mein "Problem" hier wäre ja, wenn ich die Türme per Data Table manage: Sowas wie Schaden und Cooldown der Türme sind ja nicht statisch. Einfachstes Beispiel z.B., wenn der Spieler per Skill den Schaden eines Turmes erhöht. Dann müsste ich die entsprechende Reihe im Data Table ja modifizieren. Also wenn der Cooldown des Feuerfeldes z.B. reduziert wird. Das geht nicht, oder?

    In der Tabelle anpassungen zu machen ist deswegen wohl eher try and error aber definitv besser als alle Werte immer in den Blueprints zu suchen.

    Der Schaden ist doch statisch oder? Vielleicht hast du auch eine Range die sind dann halt eben zwei statische Werte. (zb Damgage von min 0 bis max 100) Auch der Cooldown der Türme liese sich dann doch schnell anpassen.


    z.B., wenn der Spieler per Skill den Schaden eines Turmes erhöht.

    Ich glaube das geht so nicht weil du die werte wie gesagt nicht zur Runtime ändern kannst.

    Was du machen könntest wäre in der Tabelle die Range von min bis max zu bestimmen.


    Du könntest die default Werte aus der Datatable ja in eine richtige Datenbank schreiben und dort wären sie änderbar und auch online verfügbar.


    Das Datatable ist eher als Sammelstelle für Zahlen für das Setup gedacht. Damit du nicht alles in den Blueprints zusammensuchen musst.


    Falls ich falsch liege, darf mich gerne jemand korrigieren, :)

  • Was ich glaube ich aber machen könnte, ist eine (statische) Tabelle für Default Werte der Fallen und eine weitere (statische) Tabelle für die Werte der einzelnen Skills.


    NameSchadenCooldown
    Feuerfeld10015


    Namebetrifft FalleCooldown
    Ewiges FeuerFeuerfeld-5


    Und ich speichere in der GameInstance für jeden Skill einfach nur "true"/"false" ob er freigeschaltet ist, oder nicht.


    In der Falle gehe ich dann beides nacheinander durch: hole erst den default wert und gucke dann alle die Falle betreffenden Skills durch und addiere/subtrahiere ggf. die Modifikatoren der Skills auf die default Werte der Falle.


    Also im Beispiel oben stünde dann im Blueprint:

    1. Default Wert "Cooldown" des Feuerfeldes holen (15)

    2. Gucken ob der Skill "Ewiges Feuer" freigeschaltet ist; falls ja:

    3. Cooldown-Modifikator (-5) holen, zum Default addieren (neuer Wert: 10) und Wert neu setzen


    So wäre der "dynamische" Teil im Blueprint und die Werte in den Data Tables könnten ruhig statisch sein.


    Das behalte ich mal im Hinterkopf, den Umbau hebe ich mir für später auf! :D

    • Offizieller Beitrag

    Was willst du den bezwecken ?


    Änderungen in der Gameinstance zu speichern ist ja der legitime Weg.


    Wenn du aber versuchst die Datatables als Datenbank zu vergewaltigen, bin ich mir nicht sicher ob dass richtige Weg ist.


    Nach meinem Verständnis definierst du deine Default Werte in der Datatables. Beim Start macht der Turm 20 Schaden. Machst du ein Upgrade des Turms wird der neue Wert für die Ewigkeit in der Gameinstanz gespeichert und ist somit jederzeit weiter änderbar.


    Irgend wann hast vielleicht 50 unterschiedliche Türme. Jeder Turm hat 10 unterschiedliche Eigenschaften wie Cooldown, damage, Rotation, lifetime usw. Das heißt insgesamt 500 Datensätze die fürs balancing in deinen Blueprints zusammen suchen müsstest und ändern müsstest bis das balancing passt. Und wenn du jetzt nicht weißt wieviel Schaden Turm5 macht und du dich fragst ob er mehr Schaden wie Turm 6 macht, dann suchst du dir einen Wolf.


    Da ist dann eine schöne Tabelle sinnvoll wo du genau siehst welcher Turm wie viel Schaden macht, welcher Gegen in welchem Bereich stark ist und gegen welchen Turm er in welcher Zeit verliert.

  • Best practice wäre ein String Table in Verbindung mit Localization zu nutzen. Das hat den Charme das man das auch externalisieren kann, also sprich als CSV nutzen. Das hat den enormen Vorteil daß du den Table Leuten die etwas übersetzen per Mail zuschicken kannst und auch fan-made Translations sehr vereinfachst. Localization musst du eh nutzen wenn du z.B. graphische Buttons usw einsetzt, sonst wird es irgendwann sehr müssig nachzuhalten in welcher Sprache das Spiel gerade gespielt wird.


    https://docs.unrealengine.com/…n/StringTables/index.html


    Würde dir das ganze Kapitel Localization ans Herz legen wenn du mehrsprachige Spiele entwickelst.

  • Ich hab zwischenzeitlich einen zweiten Zombie gebaut.



    Außerdem hab ich zwei Freunde mal die ersten drei Level "durchspielen" lassen. Feedback war zuerst mal allerlei an Balancing Kram; außerdem aber haben die Zombies jetzt zusätzlich zur HP-Anzeige auch eine "Namensleiste", um verschiedene Typen zu unterscheiden.

  • Außerdem kann man (im Baumodus) schon gebaute Fallen jetzt auch wieder verkaufen und kriegt dann 50% der Baukosten erstattet.


    Das war so ein Feature, wo von Anfang an klar war, dass ich es einbauen muss, was auch prinzipiell einfach einzubauen ist, aber was ich trotzdem "aus Unlust" ewig vor mir her geschoben habe. Naja, jetzt funktioniert es jedenfalls!