Listeneintrag "ActorReference" aus aktuellem Level -> Zugriff auf Variablenwerte bei klick auf Button für weitere Aktionsmöglichkeiten

  • Hallo Leute,

    wie würdet ihr folgendes umsetzen?:


    Ich habe einen "Overview" gebaut, der Actors im Level mit einem bestimmten Tag (toOverview) auflistet, die sich innerhalb einer bestimmten Distanz zum PlayerCharacter befinden. Es wird der Name und die Distanz in der Liste angezeigt.


    Nun würde ich gerne beim Klick auf den Listeneintrag wieder den Actor abfragen, ob zum Beispiel eine bestimmte Variable (bool) gesetzt und entweder TRUE oder FALSE ist... oder den bestimmten Actor markieren, also sozusagen auswählen. Weitere Aktionen wie das öffnen eines kleinen Dropdowns in Mausposition ist geplant die weitere Interaktionsmöglichkeiten mit dem Actor bereitstellt.


    Wie kann ich wieder von der Liste auf den Actor zugreifen oder was würdet ihr versuchen? Vielen Dank :)



    NACHTRAG:

    Ein Weg der mir einfallen würde ist, in der Funktion die nach Actors im Level und Distanz zum PlayerCharacter sucht ein Array zu erstellen und den Array Index mit an die Listeneinträge zu schicken. Beim Klick auf den Listeneintrag wird der Index abgefragt und so erhalte ich die Actor bzw Object Reference im Array und kann somit dessen Werte/Variablen abfragen. Problem allerdings, welches ich sehe ist, dass das Array immer wieder neu aufgebaut wird sobald die "Overview" Liste aktualisiert wird. Was derzeit jede Sekunde passiert. Irgendwann wird das auf die Performance gehen denke ich. Die Liste und somit das Array muss immer wieder aktualisiert werden können, da die Actors die angezeigt werden sowohl zerstört werden können als auch spawnen.


    Ach, wie ich bei Klick auf den Listeneintrag zugreife um den Array Index wieder zu bekommen, das muss ich auch noch rausfinden ;)


    Ja, soviel noch meine Überlegungen, danke .

  • Die Frage ist, warum aktualisiert sie jede Sekunde? Muss das so sein oder steuerst du da irgendetwas über Tick, was gar nicht notwendig ist?

    Um genau zu antworten, wäre es schon hilfreich, wenn du mal beschreiben würdest, was du so umsetzen möchtest, weil hier arbeiten ja viele an unterschiedlichen Projekten. Und je nachdem, was du gerade umsetzen willst, kann dir der eine oder der andere aus Erfahrungen seines Projektes heraus vielleicht besser helfen als andere.

    Gegebenenfalls helfen auch Codeauschschnitte immer gerne weiter.

  • Hallo Tomarr, nein nicht mit Tick, mit Timelines habe ich es erstellt.

    Was ich machen möchte ist eine Liste, die Actors im Level auflistet die sich in einer bestimmten Distanz zum Player befinden. Die Distanz ist ein flexibler Wert, auch die Häufigkeit der Aktualisierung der Liste kann in einem bestimmten Rahmen, zB alle 1-5 Sekunden beeinflusst werden. Auch bewegt sich natürlich der Player, sowie die aufzulistenden Actors können sich bewegen.


    Über die Liste können Aktionen gestartet werden, die den ausgewählten Actor betreffen. Was genau möglich ist wird jedesmal abgefragt (bei Klick auf ListItem. IsAttackable, IsDestroyable... und so weiter. Denn, auch diese Möglichkeiten können sich ändern.


    Ich habe es nun so wie oben beschrieben über einen Array aller Actors im Level (mitTag toOverview) umgesetzt. Aus diesem Array wird nach Actors die sich in (flexibler) Reichweite des Players befinden gesucht und in der Liste angezeigt. Funktioniert mit "DestroyActor" mit vorangehender Abfrage ob dies möglich ist, sehr gut.


    Bis gestern Abend hat es noch nicht funktioniert, jetzt habe ich es hinbekommen, zumindest bis zu diesem Punkt ;) Ich bin mir (fast) sicher, es gibt noch eine "hübschere" Möglichkeit dies umzusetzen und ich möchte lernen :D. Zum Beispiel mache ich es bisher mit "ListItemClicked", hab aber schon erfahren, dass man es mit einem Interface möglicherweise besser machen kann.

    Codeabschnitte kann ich gerne mal liefern, allerdings sind es natürlich mehrere Funktionen in mehreren Blueprints. Wenn ich es aufgeräumt habe kann ich die kritischen Abschnitte fotografieren und zeigen.

  • Du fragst mit einer Timeline Objekte in der Nähe deines Actors ab? Klingt gruselig.

    Das Ganze ist eine recht komplexe Sache, habe sowas aber auch in meinem Projekt. Das wird definitiv ein wenig dauern, zumal ich auch gleich erstmal einkaufen gehen muss. Ich werde mal schauen, ob ich nur diesen Bereich in Form von mehreren Blueprints aus meinem Projekt raus gefummelt kriege. Ich bin ja schon etwas länger dabei ernst zu machen, weswegen bei mir inzwischen alles etwas verflochten ist. Kann also dauern, aber ich versuche mal meine Lösung, als Beispiel zu bringen. Ich hoffe, ich kriege das hin.

  • So, ich versuche mal anzufangen, auch wenn ich meine Scripte bestimmt schon 10 Mal angepasst habe und es deswegen schwer ist, den Kern alleine zu extrahieren.

    Dazu muss ich natürlich sagen, dass das vielleicht auch nicht alles zu deinem Projekt passt, weil ich habe wirklich einzelne Level, also kein Open World oder Levelstreaming im eigentlichen Sinne oder so. Jeder Level hat seine Actoren bereits von Anfang an, es wird nichts gespawnt oder so, lediglich ändert sich je nach Spielerhandlung der Zustand eines Actors, ob er nur vorhanden ist, oder ob und wie man mit ihm interagieren kann. Also, gegebenenfalls haut das bei dir nicht so hin, wie du es dir vorstellst. Aber ich versuche mal mein Script erstmal auseinanderzunehmen und auf den Kern zu beschränken.

    Als Erstes ist das Kernstück, die Tags.

    Für die Tags habe ich eine Datatable angelegt.


    Damit du die normal benutzen kannst, musst du folgende Einstellungen in den Projectsettings vornehmen.


    Das habe ich von Anfang an so gemacht, in der Hoffnung, man könne für jeden Level da die eigenen Tags einfügen, leider habe ich da noch keine Möglichkeit gefunden. Es sollte als vielleicht auch auf normalem Wege gehen, direkt in den Settings, habe ich nicht ausprobiert.

    Hier ist alles drin, von jeder Tür bis hin zum NPC, halt alles was wichtig ist.

    Zudem habe ich noch eine ENUM-Datei, in der ich festgehalten habe, welche Distanzlevel erreicht ist.

    None,
    Interaction,
    PickUp

    Dann legst du dir noch eine Scenecomponent an und nennst die zum Beispie BP_InteractionPosition

    In der Datei schaltest du lediglich Start with Tick enabled aus, weil braucht es nicht.

    Das ist jetzt erstmal der erste Teil für die Vorbereitung. Da ich erst vor kurzem meine Scripte umsortiert habe, muss ich jetzt erstmal suchen. Ich habe leider so irre viele Funktionslibs, die ich auch nicht gleich alle anständig benannt habe, denn wenn eine Funktion funktioniert, dann hat man halt die passende Node, da ist der Dateiname dann unwichtig. Shame on me, der eigentlich immer versucht sauber in der Übersicht zu bleiben.

  • Was ich bisher aber noch vergessen habe. Am besten, du machst dir Objekt_Bases. Zum Beispiel bei Türen, BP_Door_Base.

    Da kommt neben den Standards, die du als Basis benötigst noch die InteractionPosition Componente rein.

    Also, meine Doorbase sieht wie folgt aus (Ist mein erster Versuch, an der Base habe ich noch nicht so viel geändert, vielleicht gibt es bessere Lösungen)

    Auf jeden Fall kannst du dann im Construction Script, anhand deiner Spielerposition und Set relative Location (Target InteractionPosition Scenecomponent) immer die relative Position eines Objektes erfahren.

    Eigentlich war es das schon. Eigentlich brauchst du dafür die Tags noch nicht einmal. Die Tags frage ich eigentlich erst im Falle einer Interaction ab.

    Also eigentlich einfacher als ich selber dachte, ich habe aber auch einiges rausgenommen, was zu kompliziert war. Also bleibt nur noch die Scenecomponent als Anker für die Positionsberechnung.

    Falls ich jetzt mit meinem eigenen Code selber komplett durcheinander gekommen bin, tut es mir leid. Frag im Zweifelsfall einfach nach. In der Zeit versuche ich meine Scripte mal besser zu strukturieren, so sieht das total doof aus. Hatte jetzt nur eine Woche pausiert und stehe da schon selber wie der Ochse vorm Berg. :D

  • Danke Tomarr, für deine Mühe. Ja, wenn man nicht von Anfang an Ordnung hält und alles strukturiert, dann ein paar Tage nicht weiter daran arbeitet, kann man schon mal verwirrt sein was man da eigentlich zusammengestöpselt hat ;)


    Du baust die Actors wie hier beschrieben anders auf als ich das bisher habe. Die wichtigsten Parameter oder wie hier Tags über weitere "Dateien" in den Actor zu laden (wenn ich das richtig verstehe) ist sicherlich eine weitere Ausbaustufe die auch ein Flexibilitätsgewinn sein kann. Einige neue Begriffe die du hier nennst mit welchen ich mich erst mal befassen muss um zu verstehen was du da machst :).


    Aber gleich eine Frage: Was meinst du genau mit "FunctionsLibs"? Bibliotheken (eigene Datei?) mit Funktionen die du bei Bedarf in Actors oder Level und weiteres laden und wieder entladen kannst?

  • Du kannst Bluprint Funktionslibrarys anlegen. Darin hast du dann einzelne Funktionen, die du wie eigene Nodes global in dein Projekt einbauen kannst.

    Etwas Ähnliches gibt es auch noch als Makrobibliotheken, Makros sind Funktionen ähnlich, haben allerdings den Vorteil, dass sie mehrere Executeausgänge haben können. Ein Beispiel für eine Makronode ist zum Beispiel "Branch", wo es dann einen Executeausgang für "true" und einen für "false" gibt.

    Ein Beispiel für ein Makro wäre zum Beispiel meine Abfrage, ob es einen Doppelklick gab.

    Externer Inhalt blueprintue.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.


    Da gibt es dann, wie beim Branch, halt einen Ausführungszweig für Singleclick und einen für Doubleclick.

    Naja, und Funktionen brauche ich dir ja kein Beispiel zeigen, denke ich. Funktionen nutzt man ja eher öfter.

  • Also ich habe natürlich innerhalb von Blueprints, zB meinem Character Funktionen angelegt und auch schon Makros genutzt. Diese sind aber ja auf den Blueprint in dem Sie gebaut sind beschränkt (wenn man nicht von wo anders darauf einen call ausführt und so die Funktion startet).


    Ich meinte mit meiner Frage eher ob es einen Blueprint oder eine "Bibliothek" gibt, die man einfach in andere Blueprints zB Actor einbinden kann und dadruch alle Funktionen für diesen zur Verfügung stehen, die in der Biblieohek angelegt sind.

  • Also einbinden kannst du zum Beispiel Interfaces. Mit Interfaces stellst du virtuelle Funktionen innerhalb eines Actors zur Verfügung.
    Das Interface selber definiert nur den Namen und In- bzw. Output einer Funktion, der eigentliche Code wird aber im Actor ertstellt.


    Dann gibt es halt besagt Function- und Macrolibrarys, welche entsprechend Funktionen und Macros global zur Verfügung stellen.
    Und dann gibt es noch Components, davon wiederum zwei unterschiedliche Typen, die häufigste ist die Actor-Component.


    Darin befinden sich dann auch Sammlungen von Funktionen, und wird zum Beispiel zum Realisieren eines Inventorys häufig genutzt.

    Und für die Sceneactor-Component hattest du ja schon ein Beispiel. Ich selber benutze diesen bisher nur für Positionsbestimmungen eines Actors innerhalb einer Scene, wobei es da bestimmt auch noch andere Anwendungen gibt.

  • Über die Liste können Aktionen gestartet werden, die den ausgewählten Actor betreffen. Was genau möglich ist wird jedesmal abgefragt (bei Klick auf ListItem. IsAttackable, IsDestroyable... und so weiter. Denn, auch diese Möglichkeiten können sich ändern.

    Ich glaube, das habe ich das letzte Mal überlesen oder nicht richtig gedanklich in Einklang gebracht.

    Wenn ich es richtig verstanden habe, versuchst du gerade Objekte/Actoren in eine Liste zu packen, damit sie bei einer Aktion, zum Beispiel Mausklick, je nach Actor, verschiedene Actionen ausführen. Zum Beispiel eine Tür, die dann aufklappt, ein Schalter, der Licht anmacht usw.

    Wenn es das ist und ich es jetzt richtig verstanden habe, dann sind Interfaces das Mittel deiner Wahl.