Übereinandergreifende Blueprints

  • Hallo zusammen,


    und zwar arbeite ich gerade daran, Characteren die Fähigkeit zu geben, feindliche Kräfte zu identifizieren und anschließend eine Aktion (in meinem Fall zu bekämpfen) auszuführen. Hierfür habe ich eine Art Sichtfeld (bisher nicht mehr als eine Box) in das Blueprint des Pawns gezogen, bei dem, wenn ein Feind dieses betritt, die Aktion ausgeführt werden soll.
    Nun ist mein Problem alllerdings, dass ich bisher noch keinen Weg gefunden habe, dass AI die charactere in ihrem Sichtfeld identifizieren können. So sollen sie (am besten über ein "Cast to" auf das Blueprint, auf das sie treffen, zugreifen und die Fraktion (bei mir in Form einer Integer Variabel) abfragen. Stimmt diese mit der eigenen überein, soll der Gegenüber als freundlich angesehen werden. Andernfalls aber als feindlich. Dies würde ich über ein Branch feststellen. Allerdings weiß ich trotzdem noch nicht, wie die KI speziel auf das Blueprint, welches den Sichtbereich betritt, zugreifen soll, und auch nur den pawn, der sichtbar ist, angreift.


    Ich wäre über jede Form der Hilfe dankbar. Wenn es auch Tutorials dazu gibt, würde ich mich besonders freuen.


    Wenn zufällig noch jemand ein Tutorial oder ähnliches für das Sichtfeld kennt, würde ich mich auch darüber freuen.


    LG Unrealenginer

  • Zum Beispiel. Sie sollen auf das Blueprint der sich im Sichtfeld befindlichen NPCs zugreifen und mit ihren eigenen Werten vergleichen können.


    Ich dachte da an einer Intregervariabel, bei der unterschiedliche Werte (wie 0; 1; 2; ...) für unterschiedliche Gruppierungen stehen. So sollen dann die NPCs (vermutlich durch ein Equal) auswerten können, ob der Character, der vor ihnen steht, ihrer Fraktion angehören. Wenn nicht, dann sollen sie dementsprechend reagieren.


    Allerdings müssen sie dafür erstmal erkennen können, welcher Blueprint-Character vor ihnen steht, um dann auch nur speziell auf dessen Blueprint (über ein Cast-to) zugreifen zu können. Allerdings weiß ich nicht, wie sie speziell nur auf das Blueprint zugreifen, auf dass sie treffen.


    Sie sollen also Freund und Feind unterscheiden können.

    • Offizieller Beitrag

    Traceline kann doch die objekte lesen und damit kannst du dann vergleiche setzen. Traceline trifft auf ein objekt, objekt wird durch get displayname gelesen und dann kann man mit cast to arbeiten. Allerdings weis ich nicht, ob traceline auch für event tick arbeitet.


    Gesendet von meinem PadFone T004 mit Tapatalk

    • Offizieller Beitrag

    Traceline kann doch die objekte lesen und damit kannst du dann vergleiche setzen. Traceline trifft auf ein objekt, objekt wird durch get displayname gelesen und dann kann man mit cast to arbeiten. Allerdings weis ich nicht, ob traceline auch für event tick arbeitet.


    Gesendet von meinem PadFone T004 mit Tapatalk

  • Erstell dir doch ein unsichtbares Cone Objekt (Also ein Kegel). Diesen plazierst du in deinen NPC als Sichtbereich.
    Jetzt kann du ganz einfach die Üblichen Overlap Events verwenden und in dem Event kannst du dann auch direkt das Objekt identifizieren mit dem du kollidierst.


    Verstanden ?

  • Ist Traceline für einen NPC nicht ein wenig umständlich? Ich dachte vielmehr an ein simples Sichtfeld wie einer Box oder einem Kegel. Ich probier es derzeit schon mit Overlap events, hab aber noch nicht wirklich herausgefunden, wie ich ein Objekt identifizieren lasse.


    Ich habs mal mit einem "Break Hit Result" versucht und auf unterschiedliche Weisen auf den "Hit Actor" zugreifen lassen.
    Scheint zumindest nicht ganz falsch zu sein, aber auf das Blueprint, geschweige den dessen Variablen, kann ich so nicht zugreifen. Dafür aber kann der NPC den Actor verfolgen, wobei er aber keinen Unterschied macht, was das für ein Blueprint ist.


    Aber man kann auch den Namen des Actors überprüfen. Das funktioniert zwar wunderbar zur Identifizierung, allerdings auch nur bei einem einzigen Actor in der Szene, da schließlich alle Blueprints zur Unterscheidung beim Hereinziehen ein unterschiedliches Anhängsel bekommen. Umbennen hilft dabei auch nichts.


    Ein "Equal" für Objects hab ich auch probiert, doch da kam immer ein false raus.


    Langsam gehen mir nun die Ideen aus, obwohl die lösung bestimmt ganz simple ist :S

    • Offizieller Beitrag

    Die blueprintactors müssen nur unterschiedliche namen haben. Einfach die kopieren.
    Ansonsten raffe ich das irgendwie nicht. Könntest du ein simples beispiel geben? Ich verstehe das evtl so, dass zb ein zauberer unbedingt eis zauber anwenden muss, da der gegner ein feuerzauberer ist. Stimmt das so?


    Gesendet von meinem PadFone T004 mit Tapatalk

  • So in etwa. So soll es zum Beispiel einen Soldaten geben der Land A unterstützt und einen anderen Soldaten (mit anderem Blueprint) der Land B unterstützt. Wenn nun einer der beiden in das Sichtfeld eines Soldaten von Land A tritt, soll dieser auswerten, ob der Soldat im Sichtfeld auch Land A unterstützt oder aber Land B und somit ein Feind ist.
    Ist er tatsächlich ein Feind, soll er angegriffen werden.


    Aber dein Beispiel würde praktisch dann einen ähnlichen (oder sogar gleichen) Code voraussetzten.


    Ich hoffe das war halbwegs verständlich, bin nicht besonders gut im erklären :P

  • Den Kegel (Cone) packst du direkt in dein NPC der ja eh schon ein Blueprint sein sollte.
    Wenn dann dein Cone Overlapt dann hast du doch schon dein Actor im Eventstart.
    Dann castest du den Actor einfach als dein NPC und fragst die Variable ab die du benötigst...fertig.
    Wenn der Cast nicht klappt ist es auch kein NPC.

  • So, erstmal danke für Eure Hilfe :D Ich hab jetzt eine gute Lösung gefunden, die zwar vermutlich komplizierter ist als sie hätte sein müssen, aber wunderbar funktioniert


    Für die, die´s vielleicht auch mal brauchen werden:
    Ich habe kein "Cast to" sondern ein Interface benutzt und mit ihr zwei Funktionen entwickelt. Eine davon nannte ich "Sicht-betreten" und gab ihr zwei Inputs - einem Integer für die Fraktion und ein Actor-Input namens "Actor", durch den bestimmt wird, welchem Character (nennen wir ihn mal Character A) das Sichtfeld zuzuordnen ist.


    Die andere Funktion nannte ich "Angriff". Sie soll dann dem Typen mit dem Sichtfeld (Character A) sagen, dass Character B feindlich ist. Sie hat ebenfalls zwei Inputs - einer davon als Actor und der andere ein Vector für die Location des Feindes (hier Character B)


    Betritt also Character B das Sichtfeld von A, so wird durch ein Overlap-event die "Sicht-betreten" Funktion getriggert und per Message als Event im Blueprint von Character B ausgelöst. Hierbei wird durch eine Integer-Variabel die Fraktionszugehörigkeit von Character A bestimmt und in die Funktion übernommen. Als nächstes wird im Blueprint von Character B über ein "Equal" (==) überprüft, ob die Fraktionszugehörigkeit identisch ist. Durch ein (get Actor Location) kann der Funktion die Position von Character B mitgeteilt werden. Bei dem Actor-Input fügt man ein "Reference to self" hinzu (Dadurch kann Character A später besser auf den Pawn (Character B) zugreifen). Wenn die Fraktion nicht identisch ist, so wird die Funktion "Angriff" per Message an Character A zurückgesendet und löst somit ein Event aus. Dank den Inputs weiß man nun auch, welcher Pawn gemeint ist und wo dessen Position ist - somit hat man alle erforderlichen Informationen, wenn Character A dann seinen "Feind" verfolgen will ;)



    Vielleicht hilft ja meine Erklärung dem ein oder anderem, ansonsten gibt es sicherlich auch noch andere Methoden. Ich denke, Fraktionen und Gruppierungen werden nicht nur in meinem Spiel vorkommen. Sicherlich gibt es auch schnellere und einfachere Methoden, aber diese hier ist definitiv sicher und lässt keine Wünsche offen und lässt sich beliebig anpassen oder auch für andere Zwecke übertragen :D Die Verbündeten werden normalerweise durch die Überprüfung der Fraktionen nicht auch verfolgt (was aber schnell machbar wäre). Dieses Prinzip lässt sich auf jedes Blueprint übertragen, auch, wenn etwas kein NPC ist und funktioniert bei Spielern, NPCs und einfachen Actorn gleichermaßen gut.



    Und nochmal danke für die Antworten, auch, wenn ich mit meiner Methode jetzt doch andere Wege eingeschlagen habe ;)


    LG UnrealUser