Ich verzweifle am "Set Homing Target"

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Ich verzweifle am "Set Homing Target"

    Guten Tag zusammen,

    ich bräuchte nochmal Hilfe, ich finde meinen Fehler nicht.

    Ich habe einen Turm, der auf Gegner schießt. Alle Gegner in der Reichweite des Turms schreibe ich in den Array "Gegner in Range", der bei jedem Tick erst gelöscht wird und dann mit einem for each > get distance to alle Gegner in Reichweite in den Array schreibt (oberer Teil). So weit so gut, das klappt auch alles.

    Jetzt der untere Teil.

    Wenn der Cooldown vorbei ist UND sich mindestens ein Gegner in Reichweite befindet (Array length >= 1) dann soll er sich einen Gegner aus dem Array schnappen und auf den Schießen, dafür spawne ich dann ein Projektil ("Feuerball") und übergebe den anvisierten Gegner (bzw. genauer gesagt den capsule component des anvisierten Gegners) der dann im Feuerball-Blueprint als homing target gesetzt wird.

    Das Problem:

    Der Blueprint compiliert problemlos, aber das Auslesen des Array funktioniert nicht, er spant den Feuerball, aber der schießt ins Nichts statt auf den Gegner, da anscheinend kein gültiges Homing Target gesetzt wird.

    Im Message log kriege ich folgenden Blueprint Runtime Error:

    Error Blueprint Runtime Error: Accessed None trying to read property CallFunc_Array_Get_Item3 from function: 'ExecuteUbergraph_turm_magie' from node: Set Anvisiertes Ziel in graph: EventGraph in object: turm_magie with description: Accessed None trying to read property CallFunc_Array_Get_Item3

    Offensichtlich steht im Array nichts an der Stelle, die er auszulesen versucht, aber ich blicke grade überhaupt nicht wieso, da müsste ja etwas stehen, da ich ja über CompareInt gucke wie lang der Array ist und überhaupt nur spawne, wenn der Array inhalt hat...?

    Danke für jeden hilfreichen Kommentar!



  • Ich würde das auch nicht per Tick umsetzen.

    Lieber mit einem Custom Event das erst wieder das Array löscht und füllt nachdem der Schuss abgefeuert wird.

    Event startet Arrayauslesen Funktion, wenn etwas gefunden wurde, wird der Schuss ausgeführt, nach dem Schuss wird das Auslesen wieder gestartet.
    Wenn er nichts findest kannst du das Auslesen erneut starten.

    Dabei würde ich aber immer ein Delay mit einbauen, ansonsten wird es zu viel
    hier kann man meine Modelle kaufen: cgtrader.com/harlyk
    DAS GRÖSSTE KOMMUNIKATIONSPROBLEM IST,DASS WIR NICHT ZUHÖREN, UM ZU VERSTEHEN. WIR HÖREN ZU, UM ZU ANTWORTEN.
  • Daran scheint es leider nicht zu liegen.

    Ich hab den BP seit gestern glaube ich 4 mal umgebaut, hier mal das ganze ohne Tick, also er updated den ganzen Array nur noch wenn der Cooldown tatsächlich auf 0 ist (ich hab das löschen des Array mal ganz bewusst komplett rausgenommen).

    Das Resultat ist das gleiche, BP compiliert, aber der Turm schießt ins nirgendwo ohne homing target.

    Message log sagt:

    Error Blueprint Runtime Error: Accessed None trying to read property CallFunc_Array_Get_Item4 from function: 'ExecuteUbergraph_turm_magie' from node: Set Anvisiertes Ziel in graph: EventGraph in object: turm_magie with description: Accessed None trying to read property CallFunc_Array_Get_Item4

    Also ihr habt natürlich recht, ist natürlich sinnvoll den Array nicht bei jedem Tick neu zu schreiben, sondern nur wenn er gebraucht wird etc. pp. Aber das Problem scheint irgendwie zu sein, dass das Get Item nicht funktioniert, er kriegt aus dem Array irgendwie keine validen Daten raus...


  • Könntest du mal die Position vom Capsule Component ausgeben lassen, ich vermute das da einfach FVector (0,0,0) ist.
    Falls die Position in diesem Blueprint, von dem du die Screenshots gepostest hast korrekt ist, vermute ich das nächste Problem im Feuerball selbst.
    Es ist keine Multiplayer bzw. dedicated Server oder?

    Gruss
  • Ich bin gerade etwas verwirrt, wieso sind bei deinem Feuerball zwei Vectoren gelistet, ist es nicht immer null?
    Als erstes kommt mir in den Sinn, hast du dein Get auch als Referenz und nicht als Copie genommen, bei deinem Get oben wo das anvisierte Ziel definierst, scheint nämlich so als machst du da eine Kopie, dann funktioniert das nicht.
    Nochmals die Frage ist es ein Multiplayer Spiel?
  • Nun mit den neueren Versionen der Engines kannst du wenn du ein Objekt aus einem Array entnimmst, vereinfacht gesagt, entweder eine Kopie davon haben oder eine Referenz.
    Du scheinst eine Kopie davon zu nehmen. Wenn du ein original Blatt kopierst und die Kopie veränderst, ist das Original noch immer identisch wie zuvor.
    Deswegen musst du das Objekt Referenzieren, wir wollen ja schliesslich das original verändern, richtig?
    Also wenn du dein Array als eine Variable im Vieport hast und dann Get eintippst, erhälst du zwei Obtionen:

    1. Get a Copy
    2. Get a Reference

    Wir wollen eine Referenz.
    Falls du eine neuere Engine Version nutzt, hast du eine Kopie genutzt in deinem ersten Screenshot beim Get vom Array. Verstehst du?
    Also was du austauschen solltst ist die Get Node im ersten Screenshot durch Get (a ref)
  • Hatte mir das BP noch gar nicht angesehen nur das mit dem Tick kommentiert.

    Hab jetzt auch nur ganz kurz mal geschaut. Aber da fällt direkt einiges auf.

    Zunächst mal die Frage .. wo definierst du eigentlich dein Ziel ?

    1. Ja ich sehe das du die Capsule holst aber du brauchst doch eine LookAt also eine Richtung wo das Projektil lang fliegen soll und keine Position. Das ist definitiv nicht richtig.

    2. Dann hast du dieses Array Zeichen zwischen Gegner in Range und dem Get, um es mal plump zu sagen.. mach das mal weg :D
    hier kann man meine Modelle kaufen: cgtrader.com/harlyk
    DAS GRÖSSTE KOMMUNIKATIONSPROBLEM IST,DASS WIR NICHT ZUHÖREN, UM ZU VERSTEHEN. WIR HÖREN ZU, UM ZU ANTWORTEN.
  • phoenix-100 schrieb:

    1. Get a Copy

    2. Get a Reference

    Wir wollen eine Referenz

    Das ist komischer als komisch, wenn ich eine Reference setze verändert er es automatisch zu einem copy?



    Ich kann aus meinem Array keine Reference holen


    Harlyk schrieb:

    Zunächst mal die Frage .. wo definierst du eigentlich dein Ziel ?

    Wie meinst du "definieren"?

    Ich hole mir aktuell (beziehe mich mehr oder weniger auf diesen BP Setup) über length bzw. length-1 den letzten Eintrag im Array, das ist das aktuelle Ziel.


    Harlyk schrieb:

    1. Ja ich sehe das du die Capsule holst aber du brauchst doch eine LookAt also eine Richtung wo das Projektil lang fliegen soll und keine Position. Das ist definitiv nicht richtig.

    Korrigier mich, wenn ich falsch liege, aber LookAt brauche ich doch nur für die "Startposition". Habe ich der Einfachheit halber rausgenommen, für das Ziel wo er hinfliegen soll ist der LookAt eigentlich irrelevant oder.


    Harlyk schrieb:

    2. Dann hast du dieses Array Zeichen zwischen Gegner in Range und dem Get, um es mal plump zu sagen.. mach das mal weg :D

    Ist weg.
  • Ach sry, habe das mit dem Homing nicht gesehen.
    Vergiss was ich mit dem LookAt schrieb, doch leider habe ich das Homing Target selbst noch nicht ausprobiert, kann dir da also eher wenig aushelfen, sry.

    @phoenix-100
    Ja, also nicht mir aber es gibt hier einen Thread wo es genau darum ging, wo Fehler bei Zuweisungen entstanden.
    Ich schau mal ob ich den Thread noch finde.
    hier kann man meine Modelle kaufen: cgtrader.com/harlyk
    DAS GRÖSSTE KOMMUNIKATIONSPROBLEM IST,DASS WIR NICHT ZUHÖREN, UM ZU VERSTEHEN. WIR HÖREN ZU, UM ZU ANTWORTEN.
  • Ok ich habe das Problem anscheinend gelöst. :thumbup:

    Das Problem war allem Ansschein nach, dass ich im Feuerball ein Event Begin Play hatte. Ich habe daraus jetzt mal ein Tick gemacht, sprich



    und es funktioniert problemlos.

    Jetzt würde ich nur noch gerne verstehen, wieso.

    Eigentlich sollte es doch ausreichen, dem projectile movement einmalig das homing target zu setzen, dann hat er die referece und guckt immer nach wo er hinfliegen muss. Hat es wohl was damit zu tun, dass sich die Gegner um den Turm herum bewegen und er deshalb immer geupdated werden muss?
  • Zu deinem ersten BP da oben. Ist dir das nicht selber merkwürdig, mit einer Tickrate den Array zu löschen? Ist doch logisch wenn dann permanent der Array leer ist. Der Custom Event Shoot hat somit eine geringe Warscheinlichkeit überhaubt ein array element zu haben. Denn wenn Shoot abgespielt wird, ist die tickrate schon längst wieder bereit und löscht den array.

    Du machst das am besten so, wie alle es immer machen. Große Collision als Kugel errichten, wenn jemand die Collision berührt, dann mit Begin Overlap den Charakter in ein Array setzen und mit End Overlap den Charakter aus dem array löschen wenn er sie wieder verlässt. Keine Distance muss berechnet werden. GetAllActorsOfClass benutzt du nur, wenn du nicht weist, wie du direkt an die Actors im Level rann kommst. Wenn die Character eine Collision berühren, weis dieser Turm, wer diese berührt hat. Die haben dafür einen Ausgang.

    Da dein Projektil nicht funktioniert, kommen viele faktoren auf dich zu. Hier anschauen:
  • Dj EKI schrieb:

    Zu deinem ersten BP da oben. Ist dir das nicht selber merkwürdig, mit einer Tickrate den Array zu löschen? Ist doch logisch wenn dann permanent der Array leer ist. Der Custom Event Shoot hat somit eine geringe Warscheinlichkeit überhaubt ein array element zu haben. Denn wenn Shoot abgespielt wird, ist die tickrate schon längst wieder bereit und löscht den array.
    Es würde mich schon sehr wundern wenn der nächste Main-Loop schon beginnt bevor die Logik abgearbeitet ist.


    Der Rest deiner Aussage ist natürlich absolut richtig.

    @schadowhunter
    Nutze nach Möglichkeit die eingebauten Funktionen und Events der Engine, anstatt irgendwelche eigenen Konstruktionen mit EventTick und Custom Events.

    Bei dem Weg den @Dj EKI beschrieben hat , könnte man sich noch überlegen ob die Gegner sich beim Turm "anmelden" und beim Tod wieder abmelden, oder ob der Turm die Verwaltung der Gegner selbst übernimmt.
Unreal®, Unreal Engine, the circle-U logo and the Powered by Unreal Engine logo are trademarks or registered trademarks of Epic Games, Inc. in the United States and elsewhere.