[UE 4.25] Quest-System (Icon Sammlung)

  • Hallo zusammen!


    Ich mache gerade mein Quest-System fertig und bin an dem Punkt angelangt, bei dem das ganze im Spiel angezeigt wird.

    Vor allem wo das Ziel ist, mit Entfernungsberechnung usw.


    Mein Quest-System ist ein Struct in dem eine ENUM ist, in der die Quest-Klassen spezifisch eingeteilt ist. Das wäre wie folgt:

    Enum 0 = Nichts

    Enum 1 = Bewachen

    Enum 2 = Materialtransport

    Enum 3 = Ziel töten

    usw.


    Dafür brauche ich nun ICONs (also grafische Images/Bilder) die im Spiel angezeigt werden, um das ganze weniger textlastig zu machen.

    Das wäre wie folgt:


    Enum = Nichts = Fragezeichen Bild/Icon

    Enum 1 = Bewachen = Schild Bildchen

    Enum 2 = Materialtransport = Karren Bildchen

    Enum 3 = Ziel töten = Fadenkreuz



    Da ich bereits ein ENUM (im Content Browser) habe, welches ich dann als Variable im Blueprint/Widget ansprechen kann, benötige ich nun so etwas ähnliches (im Content Browser) wie ein Enum in dem alle Icons/Bilderchen abgespeichert werden und zwar genau so wie im Enum 1:1.

    Damit ich es später beim verändern einfacher habe.


    Denn je größer das Projekt wird, um so mehr fummeliger wird das ganze und dem will ich entgegen wirken. Vor allem wenn es zu Fehlern kommt, kann man so schneller sehen wo der Fehler liegt, anstatt mühselig in den ganzen Blueprints zu schauen.


    Einfach nur die Bilder in das Blueprint/Widget zu kopieren reicht mir nicht, denn die Bilder/Icons sollen später von den Spielern im Spiel verändert werden können.

    Also benötigen die sowieso einen fest Sitzplatz (als Datei). Darin sind die Basis-Icons vorhanden.


    Mehr Informationen kann ich nicht geben, weil ich nicht genau weiss wie man das Problemchen beschreibt (es handelt sich dabei um eine Leichtigkeit, nichts mega komplexes). Nur komme ich nicht auf diesen leichten Fehler.

  • Also was du willst gibt es so nicht direkt. Also müsstest du dies in eine Funktion packen.

    Entweder kommt dies A) In das BP was deine Quests Managed. B) In eine Blueprint Function Libary.


    An sich glaube ich aber dass dein Ansatz allgemein nicht sehr ideal ist:

    Auch wenn es blöd ist, dass du dein Quest System Ändern müsstest folgender Vorschlag:


    Du nutzt Objekt Orientierte Programmierung mal voll aus:

    Statt eines Structs sollten deine Quests Objects sein. D.h. Du erstellst zuerst eine Blueprint Klasse basierend auf dem Typ Object (oder Actor, falls du Replication benötgist). Dieser fügst du entsprechende Eigenschaften (Variablen) hinzu, wie z.B. das Icon, Quest Titel, Quest Text, etc. Dort kannst du auch das Verhalten programmieren was jede Quest hat oder entsprechende Schnittstellenfunktionen, falls nötig.

    Dies ist deine Basis Klasse für alle Quests.


    Nun erstellst du von dieser Blueprint Klasse neue Child Klasses. Diese benennst du nach deinen Quest Typen. Dort kannst du dann schon das entsprechende Icon Setzen. Auch hier kannst du die Logik die jede Quest des Unter-Typs sich teilt, programmieren. Eine Transport Quest z.B. hat ja durchaus gemeinsamkeiten, das hilft dir dass du ensprechenden Code nur an einer Stelle ändern musst.


    Wenn nun eine Quest Instanz erzeugen willst. Dann erzeugst du einfach ein Object vom Typ des Quests über "Construct Object From Class" und setzt nur noch Titel und Beschreibung. Da das Icon auch eine Eigenschaft der Quest ist, kannst du diese natürlich auch pro Instanz ändern.


    Wo ist der Vorteil?

    Die Logik der Quest ist in dem Typ des Quests enthalten, damit kannst du woanders Logik entfernen und dir mehr Übersicht schaffen.

    Das System arbeitet über Objekte, d.h. rein logisch sind alle variablen die auf die Quest Zeigen, zeiger auf die Quest. D.h. ein "==" bedeutet "ist es die selbe Quest" während ein "==" bei einem struct fragt ob es "die gleiche Quest" ist.

    Du hast dadurch auch viel Modularität und wenig Code Duplikation, was dir den Wartungs aufwand verringert, dadurch dass du nur einmal Programmieren musst. Damit sind verbesserungen gleich auch auf alle unter Klassen verteilt.

    Erweitern des Systems geht einfach durch erstellen eines neuen Kindes. Entfernen geht durch löschen des entprechenden Quest BP.


    Wahrscheinlich wird das etwas Arbeit für dich sein, weil ich glaube dass du dich etwas einarbeiten müsstest in OOP und die denkweise, aber ich glaube dass es sich lohnen würde.

  • Danke für eure Antworten.


    Janinus habe jetzt eine billige Alternative gefunden: über "Select Object", darin kann man Grafiken auswählen.

    https://docs.unrealengine.com/…s/SelectObject/index.html

    EDIT: Mist, ich sehe gerade da kann man nur 2 auswählen :(



    Tomura

    Das klingt sehr interessant!

    Jedoch ist es dafür schon zu spät und ich glaube das wäre in diesem Fall nicht gut, weil an meinem Quest System gibt es ein großes Problem.

    Das Problem ist, das es ein chaotisches dynamisches Quest System ist, das hat mit den normalen Quests wie man diese in Spielen kennt nichts zutun.

    Hier muss man selber prüfen ob die Quest erledigt oder abgebrochen wurde.


    Das ist schwer zu erklären, aber im Grunde ist die Quest nur eine Art Text und die eigentliche Aufgabe ist unbekannt.

    Also man sieht die Aufgabe aber nicht die Lösung.


    Angenommen Spieler A muss 10 Eisenbarren von Ort 1 nach Ort 2 bringen.

    Jetzt wird Spieler A von einem anderen Spieler überfallen oder kommt aus irgendwelchen Gründen, zu tode und verliert die "Fracht".


    Normalerweise wäre die Quest in einem normalen System fehlgeschlagen, aber hier könnte der Spieler die Fracht ersetzten oder andere Spieler dazu beauftragen die verlorene Fracht zu suchen, was wiederum in einer weiteren Aufgabe endet.

    Das bedeutet der Verlauf einer Aufgabe ist unbekannt.


    Es könnte sein das aus einer einfachen Quest eine riese Welt-Quest wird, die die Hilfe von mehreren Spielern bedarf.

    Grob gesagt man weiss nicht was passiert, das ist die stärke in meinem Projekt.

    Eine genauere Erklärung mache ich wenn ich das Projekt vorstelle.


    Deine Idee könnte ich aber prima für etwas anderes gebrauchen.

    Ich möchte Fahrzeuge einbauen die man relativ frei gestalten kann, da würde das mehr Sinn machen.


    Also der Blueprint (ich nenne es immer "MasterBlueprint") wäre ein Actor Blueprint (child vom Master) in dem Z.B. ein Reifen enthalten wäre. Das hat XYZ Eigenschaften usw. (vermutlich in Kombination mit einem Struct für die Infos?).

    Ein weiteres Blueprint (child) wäre eine Panzerplatte mit entsprechenden Eigenschaften.


    Jetzt möchte ich beides aneinander kleben, damit das Fahrzeug durch die Reifen fährt und durch die Panzerplatten geschützt ist.

    So in etwa?


    Eine genauere Hilfe wäre super :)

  • Danke für eure Antworten.


    Janinus habe jetzt eine billige Alternative gefunden: über "Select Object", darin kann man Grafiken auswählen.

    https://docs.unrealengine.com/…s/SelectObject/index.html

    EDIT: Mist, ich sehe gerade da kann man nur 2 auswählen :(

    Über den allgemeinen Select Block solltest du eigentlich so viele Outputs bekommen wie dein Enum Einträge hat. Einfach aus dem input wo das ganze rein soll einen Pfad rausziehen und einfach "Select" auswählen (ohne Object oder so)

    Dann sollte ein Select Block erscheinen der keinen typen als input hat. Dort schliest du dann einen Pfad von Typ deines Enums an und es sollten dann entsprechende zusätzliche inputs erscheinen.


    https://docs.unrealengine.com/…ilities/Select/index.html

  • Kann man beim Select, wenn man das an das Enum andockt (links seitig), auch automatisch die Anzahl aller Enums ermittelt die dann automatisch in die Enum Indexes eingelesen werden?


    Weil wenn das ich andocke und dann filter muss (etwa mit == 1 und == 2 und == 3 usw.)... oder kann man das so machen das es nicht nach zahlen gefiltert wird, sondern nach Enum == Enum(Select) = Icon 1, 2 oder 3.