mehrere "unbekannte" Variablen anlegen und später als eine auswerten

  • Hallo,


    sitze seit Tagen an einem kleinem Problem. Hoffe ihr könnt mir helfen, da ich am Verzweifeln bin.
    Ich benötige hier nur einen Ansatz


    Ich versuche es mal verständlich zu erläutern:
    ich will verschiedene Einheiten von Kriegern spawnen lassen in unbekannter Anzahl.
    Diese Charaktere haben im Groben folgende Stats: Plattform (Position); Stärke; Schutz und Gesundheit.
    Diese sind durch Boosts und ähnlichen änderbar.
    Hier entsteht eine fülle an Variablen in der Summe gerechnet: 5 Klassen x 7 Einheiten x (7 Stats+4 Boosts) x Anzahl Spawns= min. 385 Variablen


    Hier schon mein erstes Problem:
    Ich will ja nicht für jeden "eventuell" gespawnten Charakter eine Variable für die ganzen Stats anlegen.
    Kann ich das Problem über eine Data Table lösen? Ich bin mir nicht sicher ob ich die Einträge als Variable verwenden und ändern kann.
    und wie das dann geht


    Und hier mein zweites Problem:
    Jedoch soll bei den Click auf den Charakter eine eine Übersicht der Charakterstats erscheinen.
    Hierzu habe ich im Widget pro Stat Eintrag eine Variablenbindung festgelegt.
    Und hier liegt das Problem.
    Wie kann ich die entsprechenden Stats des angeklickten anzeigen.
    Ich hoffe ihr versteht soweit wie ich das jetzt meine....
    Hier würde ich es gern über eine Variante eines Counters Probieren.
    Das heißt beim Spawn erhält der Charakter die entsprechende Nummer.
    Und aufgrund der Nummer würde ich dann auf den entsprechenden Data Table Eintrag zugreifen.
    Jedoch weiß ich nicht wie jedem gespwanten Charakter eien sntsprechende Nummer verpassen.
    Hier fehlt mir jeglicher Ansatz


    Letzte Notlösung zum zweiten Problem wäre dann, dass ich pro Charakter 5 oder 10 Charakter Blueprints anlege und und die Anzahl maximaler Beschwörung begrenze.


    Falls ihr mehr/andere Infos braucht sagt es einfach.


    Danke im Voraus für eure Hilfe

  • Hab mit der Data Table noch nichts gemacht. Du findest aber zwei Threads unter deinem einen Thread dazu mit zwei Bildern. Da kommen aber sicher noch Antworten zu.


    Zu der Nummer. Ist dein Charakter ein Actor? Dann kannst du in dem Actor hinter Constructions Script ein get all actors of class machen. Da deinen Actor raussuchen. Dann werden alle Actors die gespawnt sind in einem Array zurück gegeben. Also erst 1 dann 2 dann 3. Du kannst die Array Größe mit Length auslesen.

  • Nunja, das lässt sich auf vielen Wegen erreichen. Ich habe nur ein Beispiel, wie ich es machen würde:


    Du musst nicht umbedingt einen Character_BP benutzen, wenn du die Funktionen, die dieser mit sich bringt (AI, Navmesh, ect) nicht umbedingt benötigst. Aber das nur außen vor.


    Erstelle einen Character_BP mit folgenden Variablen


    Klasse
    Einheit
    Position, Stärke, Gesundheit, Mana, ect, ect


    Das sind nicht viele, wenn man bedenkt, dass viele Texturen schon einige MB groß sind ;) Solange du nicht tausende davon spawnst, ist das schon ok.


    Wenn der Character gespawnt wird, erhält er er eine Klasse und Einheit, und sonst noch alles was für Ihn festgelegt ist. Die Werte wie Angriff, Verteidigung, ect hohlt er sich dann aus einem DataTable. Das könnte so aussehen:



    Klasse Zauberer Krieger
    Leben 10 100
    Mana 200 10
    Speed 10 5


    Das wäre z.B. ein DataTable. Du könntest dann noch einen für Zeug erstellen, dass von der Einheit abhängig ist.


    Zur übersicht empfiehlt es sich vorab eine Excel Tabelle zu erstellen.





    Also hier der gesamte Vorgang:
    Character wird erstellt und ihm werden 2 Werte zugewiesen z.B:


    Klasse: Krieger
    Einheit: Nahkämpfer


    Dann hohlt sich der Character die Werte für seine Klasse und Einheitentyp aus den DataTables:


    Klasse: Krieger
    Einheit: Nahkämpfer
    Leben: 100
    Mana: 10
    Spezialangriff: Schwertwurf
    [...]


    Wenn du ihn jetzt anklickst, kannst du diese variablen verwenden, um alle Infos im Widget anzuzeigen.


    Character IDs brauchst du dafür nicht umbedingt, es ist besser, du gehst über Referenzen ;)
    Klickst du z.B. einen Character an, dann weißt du ja welchen du angeklickt hast :)

  • Hi,


    wenn sich deine Klassen zusehr unterscheiden das es keinen Sinn macht ihnen irgendwelche Variablen zu geben kann man auch Abgeleitete Klassen erstellen (rechtsklick auf den Actor >> Create Child BP Class).
    Alle ChildClass haben dann die Eigenschaften der ParentClass plus derjenigen die für diese Character Klasse relevanten.


    DataTables sind reine Daten und können nicht zur Laufzeit geändert werden. Sie eignen sich super um beim spawnen eines Actors ihm die nötigen Werte zuweisen zu können. Sollen die Werte verändert werden musst du das in extra Variablen machen. Hier kannst du gleich das Struct nehmen welches du für das DataTable erstellt hast.

  • Das Grundproblem scheint relativ simple. Du benötigst letztlich nur die Anzahl an Variablen, die maximal von einer Einheit an Eigenschaften benötigt werden. Eigenschaften, welche nicht Zahlen entsprechen werden über Enum deklariert und im BP verarbeitet, SwitchOnEnum. Dann benötigst du noch eine NameVar die derjenigen Zeile des DataTables entspicht um sie auszulesen.


    Boosts sind völlig unabhängig und ändern eine im BP bestehende Variable. Ansonsten gilt das, was DarkFaces gesagt hat. Ein einzige Variable im BP anlegen, welche das Struct deines DataTables hat und im ConstructionScript diese Werte aus dem DataTable zuweisen. Beim Spawn wird der Rest dann automatisch geregelt und in die SpawnRoutine kann im ConstrucitonScript auch noch ein Zufallswert eingebaut werden RandomInRange.


    Bei jeder Veränderung sollte vielleicht noch eine Speicherung erfolgen oder zumindest eine Routine fürs Abspeichern. Je nachdem wie du das gern hättest.

  • Danke für die Ratschläge.



    Werde jetzt zwei Datenbanken anlegen, für die Grundewerte der Einheiten und eine für die Standardboostwerte anlegen
    und diese dann per Funktion kombinieren. So habe ich dann am Ende nur noch 8 Variablen anzulegen und zu verarbeiten.
    zusätzlich lege ich noch die Meshes/Materials und anim als Variable an um nur ein BP zu haben und lasse mir die ebenfalls aus der Datenbank zuweisen.
    Problem 1 solved!


    An Problem 2 arbeite ich noch, habe eine Idee bastel aber noch daran rum.


    BTW: seit 4.16 sollen sich Datenbankeneinträge auch als Variable verwenden und ändern lassen, schaue ich mir vielleicht später mal an